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.

159 lines
3.9 KiB
C++

#include <iostream>
#include "modbus_lib/modbus-tcp.h"
#include "common.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 s = -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;
//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, 1502);
//modbus_set_slave(ctx, SERVER_ID);
}
modbus_set_response_timeout(ctx, 20, 0);
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
unsigned char* src = (unsigned char*)tab_rp_registers;
rc = modbus_read_registers(ctx, start_hold_register, number_regs, tab_rp_registers);
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 t3 = 0x64F9 << 16 | 0x4204;
//printf("t3=%ld\n", t3);
//time_t t4 = 1694056964;
//printf("%02x\n",t4);
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;
}