#define MODBUS_TCP_PORT 502
#define MODBUS_TCP_TIMEOUT 1000
#define DIM(x) (sizeof(x)/sizeof(x[0]))
{
static int getReg(
UINT8 *pData,
UINT16 nth,
void *pUserData);
static int setReg(
UINT8 *pData,
UINT16 nth,
void *pUserData);
{
};
static int getReg(
UINT8 *pData,
UINT16 nth,
void *pUserData)
{
char *ptr = (char *)&data;
pData[nth * 2] = ptr[1];
pData[nth * 2 + 1] = ptr[0];
}
static int setReg(
UINT8 *pData,
UINT16 nth,
void *pUserData)
{
}
{
int rc = 0;
int mapSize =
DIM(ModbusMap);
int i, j;
{
printf("MX_RTU_Modbus_Tcp_Slave_Init(), return code = %d.\n", rc);
}
else
{
printf("MX_RTU_Modbus_Tcp_Slave_Register(%d, %d, %d), return code = %d.\n",
port, mapSize, idleTimeoutMS, rc);
for(i = 0; i <
DIM(ModbusMap); i++)
{
{
printf("MX_RTU_Modbus_Tcp_Slave_Add_Entry(), return code = %d.\n", rc);
break;
}
}
}
return rc;
}
{
int rc = 0;
printf("MX_RTU_Modbus_Tcp_Slave_Unregister(%d), return code = %d.\n",
*pHandle, rc);
printf("MX_RTU_Modbus_Tcp_Slave_Uninit(), return code = %d.\n", rc);
}
int main(
int argc,
char **
const argv)
{
int rc, i;
int mapSize =
DIM(ModbusMap);
UINT32 doSlot = 2, slotMin = 1, slotMax = 0;
int diChannelAmount = 16;
int doChannelAmount = 16;
int connectionAmount = 0;
while(-1 != (rc = getopt(argc, argv, "hi:s:p:")))
{
switch(rc)
{
case 'i':
diSlot = atoi(optarg);
if(diSlot < slotMin || diSlot > slotMax)
{
printf("Error parameter: slot: %d\n", diSlot);
return -1;
}
break;
case 's':
doSlot = atoi(optarg);
if(doSlot < slotMin || doSlot > slotMax)
{
printf("Error parameter: slot: %d\n", doSlot);
return -1;
}
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 Slave sample program.\n\n");
printf("Usage: ./modbus_tcp_slave [OPTIONS]\n\n");
printf("Get DI value and set DO value\n\n");
printf("Options:\n");
printf("\t%-8s Slot of DI module [%d-%d]. Default slot = %d\n",
"-i", slotMin, slotMax, diSlot);
printf("\t%-8s Slot of DO module [%d-%d]. Default slot = %d\n",
"-s", slotMin, slotMax, doSlot);
printf("\t%-8s Port of Modbus TCP Slave. Default port = %d\n",
"-p", port);
printf("\n");
return 0;
}
}
printf("%-10s: %d\n", "DI slot", diSlot);
printf("%-10s: %d\n", "DO slot", doSlot);
printf("%-10s: %d\n", "TCP port", port);
printf("ModbusSlaveInit(%d), return code = %d.\n\n", port, rc);
printf("MX_RTU_Modbus_Tcp_Slave_Map_Count(%d), return code = %d.\n\n", handle, rc);
else
printf("Entry count = %d\n", count);
printf("MX_RTU_Modbus_Tcp_Slave_Map_Dump(%d), return code = %d.\n\n", handle, rc);
printf("MX_RTU_Modbus_Tcp_Slave_Start(%d), return code = %d.\n", handle, rc);
pDIValue = &(ModbusMap[0].
reg);
pDOValue = &(ModbusMap[1].
reg);
lastDOValue = *pDOValue;
printf("MX_RTU_Module_DO_Value_Set(%d, 0x%04X), return code = %d.\n",
doSlot, *pDOValue, rc);
printf("\nModbus Server is running... port: %d\n\n", port);
while(1)
{
{
printf("MX_RTU_Module_DI_Value_Get(%d), return code = %d.\n", diSlot, rc);
break;
}
if(*pDOValue != lastDOValue)
{
lastDOValue = *pDOValue;
{
printf("MX_RTU_Module_DO_Value_Set(%d, 0x%04X), return code = %d.\n",
doSlot, *pDOValue, rc);
break;
}
}
memset(&connectionInfo, 0, sizeof(connectionInfo));
{
printf("MX_RTU_Modbus_Tcp_Slave_Connection_Info(%d), return code = %d.\n",
handle, rc);
break;
}
if(connectionAmount != connectionInfo.accepted_connections)
{
connectionAmount = connectionInfo.accepted_connections;
printf("Number of connections = %d\n", connectionAmount);
for(i = 0; i < connectionAmount; i++)
{
printf("(%d) IP = %s, port = %d\n", i + 1, connectionInfo.ip[i],
connectionInfo.port[i]);
}
}
usleep(200000);
}
printf("Stop Server\n");
printf("MX_RTU_Modbus_Tcp_Slave_Stop(%d), return code = %d.\n", handle, rc);
printf("ModbusSlaveUninit(), return code = %d.\n", rc);
return 0;
}