#define MODBUS_SERIAL_PARITY 'N'
#define MODBUS_DEVICE_ID 1
#define MODBUS_SIZE 3000
#define DIM(x) (sizeof(x)/sizeof(x[0]))
{
keepRunning = 1;
}
{
int (*
pfnModRead)(UINT8 *pData, UINT16 nth,
void *pUserData);
int (*
pfnModWrite)(UINT8 *pData, UINT16 nth,
void *pUserData);
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)
{
UINT16 data = 0;
char *ptr = (char *)&data;
pData[nth * 2] = ptr[1];
pData[nth * 2 + 1] = ptr[0];
}
static int setReg(UINT8 *pData, UINT16 nth, void *pUserData)
{
UINT16 value =
MAKE_WORD(pData[nth * 2], pData[nth * 2 + 1]);
}
int main(
int argc,
char *argv[])
{
UINT32 handle_num;
int rc = 0;
int i;
UINT32 rtuSlot = 1;
UINT32 diSlot = 2;
UINT32 doSlot = 3, slotMin = 1, slotMax = 0;
int diChannelAmount = 16;
int doChannelAmount = 16;
UINT32 *pDIValue;
UINT32 *pDOValue;
UINT32 lastDOValue;
while(-1 != (rc = getopt(argc, argv, "hr:i:s:")))
{
switch(rc)
{
case 'r':
rtuSlot = atoi(optarg);
if (rtuSlot < slotMin || rtuSlot > slotMax) {
printf("Error parameter: slot: %d\n", rtuSlot);
return -1;
}
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 '?':
case 'h':
default:
printf("Modbus RTU Slave sample program.\n\n");
printf("Usage: ./modbus_rtu_slave [OPTIONS]\n\n");
printf("Get DI value and set DO value\n\n");
printf("Options:\n");
printf("\t%-8s Slot of RTU module [%d-%d]. Default slot = %d\n",
"-r", slotMin, slotMax, rtuSlot);
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("\n");
return 0;
}
}
printf("%-10s: %d\n", "RTU slot", rtuSlot);
printf("%-10s: %d\n", "DI slot", diSlot);
printf("%-10s: %d\n", "DO slot", doSlot);
memset(¶m, 0, sizeof(param));
printf("MX_RTU_Modbus_Rtu_Slave_Init error, rc = %d\r\n", rc);
return -1;
}
printf(
"Rtu Slave Register Fail, rtuSlot = %d, port = %d, handle = %d, rc = %d\n", rtuSlot,
PORT1, handle_num, rc);
return -1;
}
for(i = 0; i <
DIM(ModbusMap); i++)
{
{
printf("MX_RTU_Modbus_Rtu_Slave_Add_Entry(), return code = %d.\n", rc);
return -1;
}
}
printf("MX_RTU_Modbus_Rtu_Slave_Start handle %d error, rc = %d\r\n", handle_num, rc);
return -1;
}
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);
while(!keepRunning)
{
{
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;
}
}
usleep(200000);
}
printf("Stop Server\n");
printf("MX_RTU_Modbus_Rtu_Slave_Stop handle %d error, rc = %d\r\n", handle_num, rc);
return -1;
}
printf("Modbus Rtu Slave Unregister handle %d error, rc = %d\r\n", handle_num, rc);
return -1;
}
printf("MX_RTU_Modbus_Rtu_Slave_UnInit error, rc = %d\r\n", rc);
return -1;
}
return 0;
}