You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
5.1 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <iostream>
#include "modbus_lib/modbus-tcp.h"
#include "common.h"
#include "time.h"
using namespace std;
#define REG_ADDR (header_length+1)
#define REG_NUM (header_length+3)
#define REG_VAL (header_length+3)
#define IP_SLAVE_ADDR "192.168.1.21"
#define TCP_PORT 1502
#define SERVER_ID 0x00000001
static char slave_ip_addr[20] = { 0 };
static unsigned short slave_tcp_port = TCP_PORT;
#define SLAVE_REG_ADDR 0x008E
enum {
TCP,
TCP_PI,
RTU
};
//modbus 从机tcp ipaddr
void xMaster_Set_slave_ip_addr(const char *ip_addr)
{
if (ip_addr) {
memcpy(slave_ip_addr, ip_addr, strlen(ip_addr));
printf("slave_ip_addr=%s\n", slave_ip_addr);
}
else {
memcpy(slave_ip_addr, IP_SLAVE_ADDR, strlen(IP_SLAVE_ADDR));
printf("ip_addr is null,use default\n");
}
}
//modbus从机tcp port
void xMaster_Set_slave_port(const char* tcp_port)
{
if (tcp_port) {
slave_tcp_port = atoi(tcp_port);
printf("tcp_port=%s\n", tcp_port);
printf("slave_tcp_port=%d\n", slave_tcp_port);
}
else {
slave_tcp_port = TCP_PORT;
printf("SLAVE_PORT is null,use default\n");
}
}
DWORD WINAPI xModbus_master_Proc(LPVOID lp) {
char* com = (char*)lp;
CHAR rcv_buf[1024] = { 0 };
int sockt = -1;
int i = 0;
int rc = 0;
modbus_t* ctx = NULL;
uint8_t query[MODBUS_TCP_MAX_ADU_LENGTH];//接收缓冲区
int header_length;
uint16_t* ptr,*ptr1;
int use_backend=TCP;
uint16_t reg_addr, reg_val, reg_num;
uint16_t tmp = 0;
modbus_mapping_t* mb_mapping;
int nb_points;
uint16_t* tab_rp_registers = NULL;
fd_set fdset_ro, fdset_wr, fdset_ex;
struct timeval timeout;
//Read the starting address of the holding register
unsigned short start_hold_register = 0x0000;//读保持寄存器的起始地址
//Number of registers read from start address
int number_regs = 22;//从起始地址开始读的寄存器数量
nb_points = 500;
tab_rp_registers = (uint16_t*)malloc(nb_points * sizeof(uint16_t));
if (NULL != tab_rp_registers) {
memset(tab_rp_registers, 0, nb_points * sizeof(uint16_t));
}
if (use_backend == TCP) {
ctx = modbus_new_tcp(slave_ip_addr, slave_tcp_port);
//modbus_set_slave(ctx, SERVER_ID);
}
modbus_set_response_timeout(ctx, 20, 0);
while (1) {
if (sockt <= 0)
{
sockt = modbus_connect(ctx);
if (sockt == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
//modbus_free(ctx);
Sleep(1);
continue;
}
else
{
printf("Connection Success! socket=%d\n", sockt);
}
}
unsigned char* src = (unsigned char*)tab_rp_registers;
#if 1
if (sockt <= 0)
continue;
FD_ZERO(&fdset_ro);
FD_ZERO(&fdset_wr);
FD_ZERO(&fdset_ex);
FD_SET(sockt, &fdset_ro);
FD_SET(sockt, &fdset_wr);
FD_SET(sockt, &fdset_ex);
memset((char*)&timeout, 0, sizeof(struct timeval));
if (select(sockt + 1, &fdset_ro, &fdset_wr, &fdset_ex, &timeout) < 1)
{
Sleep(1);
continue;
}
if (FD_ISSET(sockt, &fdset_ex))
{
//printf("关闭tcp端口\n");
closesocket(sockt);
sockt = -1;
break;
}
if (FD_ISSET(sockt, &fdset_wr)) {
#endif
rc = modbus_read_registers(ctx, start_hold_register, number_regs, tab_rp_registers);
#if 1
if (rc == -1)
{
closesocket(sockt);
sockt = -1;
printf("End Thread\n");
continue;
}
#endif
}
else
{
Sleep(1000);
continue;
}
Sleep(3 * 1000);
//xUnsigned_char_hex_out("recv", src, 0, number_regs*2);
xRead_reg_hex_out(start_hold_register, "master recv", src, 0, number_regs * 2);
//int slave_addr = MODBUS_GET_INT32_FROM_INT16(tab_rp_registers, 0);
//printf("slave_addr=%d\n", slave_addr);
float H2 = modbus_get_float(tab_rp_registers);
printf("H2=%f\n", H2);
float CO = modbus_get_float(tab_rp_registers + 2);
printf("CO=%f\n", CO);
float CO2 = modbus_get_float(tab_rp_registers + 4);
printf("CO2=%f\n", CO2);
float CH4 = modbus_get_float(tab_rp_registers + 6);
printf("CH4=%f\n", CH4);
float C2H2 = modbus_get_float(tab_rp_registers + 8);
printf("C2H2=%f\n", C2H2);
float C2H4 = modbus_get_float(tab_rp_registers + 10);
printf("C2H4=%f\n", C2H4);
float C2H6 = modbus_get_float(tab_rp_registers + 12);
printf("C2H6=%f\n", C2H6);
float total = modbus_get_float(tab_rp_registers + 14);
printf("total=%f\n", total);
float water = modbus_get_float(tab_rp_registers + 16);
printf("water=%f\n", water);
//xUnsigned_char_hex_out("recv", src, 36, 36+7);
int H32 = modbus_get_int(tab_rp_registers + 18);
printf("H32=%d\n", H32);
int L32 = modbus_get_int(tab_rp_registers + 20);
printf("L32=%d\n", L32);
time_t t = H32 << 32 | L32;
printf("t=%ld\n", t);
time_t now = time(NULL);
struct tm t0;
localtime_s(&t0, &now);
printf("收到数据时间是:%d年%d月%d日 %d时%d分%d秒\n", t0.tm_year + 1900, t0.tm_mon + 1, t0.tm_mday, t0.tm_hour, t0.tm_min, t0.tm_sec);
//printf("t=%d\n", (int)time(NULL));
//time_t t3 = 0x64F9 << 16 | 0x4204;
//printf("t3=%ld\n", t3);
//time_t t4 = 1694056964;
//printf("%02x\n",t4);
Sleep(15 * 1000);
}
//while (1);
return 0;
}
int xModbus_master_task_init()
{
// 创建线程,返回句柄
int a = 0;
HANDLE h = CreateThread(NULL, 0, xModbus_master_Proc, NULL, 0, 0);
//WaitForSingleObject(h, INFINITE);
//CloseHandle(h);
return 0;
}