#define MODBUS_TCP_IP "192.168.13.44"
#define MODBUS_TCP_PORT 502
#define MODBUS_TCP_TIMEOUT 1000
#define DIM(x) (sizeof(x)/sizeof(x[0]))
{
{
};
{
int count = 3;
char *pch;
while(count)
{
pch = strstr(pch, ".");
if(pch == NULL) return -1;
pch++;
count--;
}
return 0;
}
{
printf("%c[%d;%df", 0x1B, y, x);
}
{
int rc = 0;
int unitID = 1;
{
printf("MX_RTU_Modbus_Master_Init(), return code = %d\n", rc);
}
else
{
{
printf("MX_RTU_Modbus_Tcp_Master_Open(%s, %d, %d), return code = %d\n",
szIPAddr, port, idleTimeout, rc);
}
else
{
{
printf("MX_RTU_Modbus_Tcp_Master_Ioctl(%d, %d, %d), return code = %d\n",
*pHandle, unitID, idleTimeout, rc);
}
}
}
return rc;
}
{
int rc = 0;
printf("MX_RTU_Modbus_Tcp_Master_Close(%d), return code = %d\n", *pHandle, rc);
return rc;
}
int main(
int argc,
char **
const argv)
{
int rc, i;
int tabSize =
DIM(ModbusTab);
memset(szIPAddr, 0, sizeof(szIPAddr));
while(-1 != (rc = getopt(argc, argv, "hi:p:")))
{
switch(rc)
{
case 'i':
{
printf("Invalid IP\r\n");
return -1;
}
memset(szIPAddr, 0, sizeof(szIPAddr));
strncpy(szIPAddr, optarg, strlen(optarg));
break;
case 'p':
port = atoi(optarg);
if(port < 0)
{
printf("Error parameter: port: %d\n", port);
return -1;
}
break;
case '?':
case 'h':
default:
printf("Modbus TCP master sample program.\n\n");
printf("Usage: ./modbus_tcp_master [OPTIONS]\n\n");
printf("Options:\n");
printf("\t%-8s IP of Modbus TCP Slave. Default IP = %s\n",
"-i", szIPAddr);
printf("\t%-8s Port of Modbus TCP Slave. Default port = %d\n",
"-p", port);
printf("\n");
return 0;
}
}
system("clear");
printf("%-10s: %s\n", "Slave IP", szIPAddr);
printf("%-10s: %d\n", "Slave port", port);
pDIValue = &(ModbusTab[0].
reg);
pDOValue = &(ModbusTab[1].
reg);
lastDOValue = *pDOValue;
printf("ModbusMasterInit(), return code = %d.\n\n", rc);
printf("========================================");
for(i = 0; i < tabSize; i++)
printf(
"\n[0x%02X%04X] -> ", ModbusTab[i].
group, ModbusTab[i].
addr);
printf("========================================");
for(i = 0; tabSize > 0; i++)
{
if(i >= tabSize)
i = 0;
switch(ModbusTab[i].group)
{
1, (
UINT8*) & (ModbusTab[i].
reg), &exceptionCode);
printf("MX_RTU_Modbus_Tcp_Master_Read_Coils(%d, 0x%04X, %d), return code = %d, exception code = %d.\n",
handle, ModbusTab[i].addr, 1, rc, exceptionCode);
break;
1, (
UINT8*) & (ModbusTab[i].
reg), &exceptionCode);
printf("MX_RTU_Modbus_Tcp_Master_Read_Discrete_Inputs(%d, 0x%04X, %d), return code = %d, exception code = %d.\n",
handle, ModbusTab[i].addr, 1, rc, exceptionCode);
break;
ModbusTab[i].addr, 1, (
UINT16*) & (ModbusTab[i].
reg), &exceptionCode);
printf("MX_RTU_Modbus_Tcp_Master_Write_Holding_Regs(%d, 0x%04X, %d), return code = %d, exception code = %d.\n",
handle, ModbusTab[i].addr, 1, rc, exceptionCode);
ModbusTab[i].addr, 1, (
UINT16*) & (ModbusTab[i].
reg), &exceptionCode);
printf("MX_RTU_Modbus_Tcp_Master_Read_Holding_Regs(%d, 0x%04X, %d), return code = %d, exception code = %d.\n",
handle, ModbusTab[i].addr, 1, rc, exceptionCode);
break;
ModbusTab[i].addr, 1, (
UINT16*) & (ModbusTab[i].
reg), &exceptionCode);
printf("MX_RTU_Modbus_Tcp_Master_Read_Input_Regs(%d, 0x%04X, %d), return code = %d, exception code = %d.\n",
handle, ModbusTab[i].addr, 1, rc, exceptionCode);
break;
default:
printf("Error Modbus group: %d\n", ModbusTab[i].group);
continue;
}
break;
printf(
"0x%04X", ModbusTab[i].
reg);
fflush(0);
if(*pDIValue == 0x0BAD)
*pDOValue = 0xFFFF;
else
*pDOValue = *pDIValue;
usleep(200000);
}
printf("ModbusMasterUninit(%d), return code = %d.\n\n", handle, rc);
return 0;
}