#define BUFFER_SIZE 128
#define SERVICE_MODBUSMASTER_STATUS_TAG "Service_ModbusMaster_Status"
#define SERVICE_MODBUSSLAVE_STATUS_TAG "Service_ModbusSlave_Status"
int main(
int argc,
char * argv[])
{
int i = 0;
int retval = 0;
int tagValue = 0;
unsigned int unsignedTagValue = 0;
float floatTagValue = 0.0;
{"IR_S2_DO0_DOValue"},
{"IR_S0_SR_DeviceName"},
{"IR_Service_ModbusSlave_Status"},
};
char cmdBuf[][
BUFFER_SIZE] = {{
"0: read Modbus Master Service status"},
{"1: read Modbus Slave Service status"},
{"2: read Modbus Tags by Master"},
{"3: write DO Tags to be \"On\" by Master"},
{"4: write DO Tags to be \"Off\" by Master"},
{"5: exit program"},
};
while((retval = getopt(argc, argv, "h")) != -1)
{
switch(retval)
{
case '?':
case 'h':
default:
printf("%s.\n\n", "ioPAC8500 Modbus TCP Master and Slave program");
printf("Usage: ./ioPAC8500_modbus_tcp_master_and_slave [OPTIONS]\n\n");
printf("Options:\n");
printf("\tNo options.\n");
printf("\n");
return;
}
}
printf("\r\nTag Init\r\n");
{
printf("MX_RTU_Tag_Init error = %d\r\n", retval);
return -1;
}
else printf("Tag Init ok!\r\n\r\n");
printf("Get Tag Info\r\n");
memset(&modbusMasterStatusTagInfo, 0, sizeof(modbusMasterStatusTagInfo));
{
goto exit;
}
memset(&modbusSlaveStatusTagInfo, 0, sizeof(modbusSlaveStatusTagInfo));
{
goto exit;
}
modbusTagsTagInfo = malloc(nModbusTags *
sizeof(
TAG_INFO));
memset(modbusTagsTagInfo, 0,
sizeof(nModbusTags *
sizeof(
TAG_INFO)));
for(i = 0; i < nModbusTags; i++)
{
memset(&modbusTagsTagInfo[i], 0,
sizeof(
TAG_INFO));
{
printf("tagName = %s, MX_RTU_Tag_Get_Info error = %d\r\n", modbusTags[i], rc);
free(modbusTagsTagInfo);
goto exit;
}
}
printf("Get Tag Info ok\r\n\r\n");
printf("Get Modbus TCP Master and Slave Service status\r\n\r\n");
while(timeOut)
{
memset(tagBuf, 0, sizeof(tagBuf));
{
free(modbusTagsTagInfo);
goto exit;
}
else
{
tagValue = 0;
memcpy(&tagValue, tagBuf, modbusMasterStatusTagInfo.
tagSize);
}
{
printf("Modbus TCP Master Service initing, please wait...\r\n");
}
{
printf("Modbus TCP Master Service is ready!\r\n");
break;
}
{
printf("Modbus TCP Master Service init fail...exit program!\r\n");
free(modbusTagsTagInfo);
goto exit;
}
else
{
printf("Invalid status...exit program!\r\n");
free(modbusTagsTagInfo);
goto exit;
}
timeOut--;
sleep(1);
}
if(timeOut == 0)
{
printf("Timeout!!! Modbus TCP Master Service is not ready...exit program!\r\n");
free(modbusTagsTagInfo);
goto exit;
}
timeOut = 60;
printf("\r\n");
while(timeOut)
{
memset(tagBuf, 0, sizeof(tagBuf));
{
free(modbusTagsTagInfo);
goto exit;
}
else
{
tagValue = 0;
memcpy(&tagValue, tagBuf, modbusSlaveStatusTagInfo.
tagSize);
}
{
printf("Modbus TCP Slave Service initing, please wait...\r\n");
}
{
printf("Modbus TCP Slave Service is ready!\r\n");
break;
}
{
printf("Modbus TCP Slave Service init fail...exit program!\r\n");
free(modbusTagsTagInfo);
goto exit;
}
else
{
printf("Invalid status...exit program!\r\n");
free(modbusTagsTagInfo);
goto exit;
}
timeOut--;
sleep(1);
}
if(timeOut == 0)
{
printf("Timeout!!! Modbus TCP Slave Service is not ready...exit program!\r\n");
free(modbusTagsTagInfo);
goto exit;
}
while(1)
{
printf("\r\n");
{
printf("%s\r\n", cmdBuf[i]);
}
printf("Enter:");
cmd = getchar();
cmd -= 0x30;
printf("\r\ncommand = %d\r\n", cmd);
getchar();
switch(cmd)
{
case 0:
memset(tagBuf, 0, sizeof(tagBuf));
{
}
else
{
tagValue = 0;
memcpy(&tagValue, tagBuf, modbusMasterStatusTagInfo.
tagSize);
}
break;
case 1:
memset(tagBuf, 0, sizeof(tagBuf));
{
}
else
{
tagValue = 0;
memcpy(&tagValue, tagBuf, modbusSlaveStatusTagInfo.
tagSize);
}
break;
case 2:
for(i = 0; i < nModbusTags; i++)
{
memset(tagBuf, 0, sizeof(tagBuf));
memset(×tamp, 0, sizeof(timestamp));
rc =
MX_RTU_Tag_Read(modbusTags[i], (
void *)tagBuf,
sizeof(tagBuf), &readBytes, ×tamp);
if(rc !=
TAG_ERR_OK || readBytes != modbusTagsTagInfo[i].tagSize)
{
printf("tagName = %s, MX_RTU_Tag_Read error = %d, readBytes = %d, tagSize = %d\r\n", modbusTags[i], rc, readBytes, modbusTagsTagInfo[i].tagSize);
continue;
}
else
{
{
tagValue = 0;
memcpy(&tagValue, tagBuf, modbusTagsTagInfo[i].tagSize);
printf("tagName = %s, dataType = %d, value = %d, timestamp = %d:%d:%d.%d(hour:min:sec.msec)\r\n", modbusTags[i], modbusTagsTagInfo[i].dataType, tagValue, timestamp.hour, timestamp.min, timestamp.sec, timestamp.msec);
}
{
unsignedTagValue = 0;
memcpy(&unsignedTagValue, tagBuf, modbusTagsTagInfo[i].tagSize);
printf("tagName = %s, dataType = %d, value = %u, timestamp = %d:%d:%d.%d(hour:min:sec.msec)\r\n", modbusTags[i], modbusTagsTagInfo[i].dataType, tagValue, timestamp.hour, timestamp.min, timestamp.sec, timestamp.msec);
}
{
printf("tagName = %s, dataType = %d, value = %f, timestamp = %d:%d:%d.%d(hour:min:sec.msec)\r\n", modbusTags[i], modbusTagsTagInfo[i].dataType, floatTagValue, timestamp.hour, timestamp.min, timestamp.sec, timestamp.msec);
}
{
printf("tagName = %s, dataType = %d, value = %s, timestamp = %d:%d:%d.%d(hour:min:sec.msec)\r\n", modbusTags[i], modbusTagsTagInfo[i].dataType, tagBuf, timestamp.hour, timestamp.min, timestamp.sec, timestamp.msec);
}
}
}
break;
case 3:
for(i = 0; i < nModbusTags; i++)
{
if(strstr(modbusTags[i], "DOValue"))
{
tagValue = 1;
rc =
MX_RTU_Tag_Write(modbusTags[i], (
void *)&tagValue, modbusTagsTagInfo[i].tagSize);
printf("tagName = %s, MX_RTU_Tag_Write = %d\r\n", modbusTags[i], rc);
}
}
break;
case 4:
for(i = 0; i < nModbusTags; i++)
{
if(strstr(modbusTags[i], "DOValue"))
{
tagValue = 0;
rc =
MX_RTU_Tag_Write(modbusTags[i], (
void *)&tagValue, modbusTagsTagInfo[i].tagSize);
printf("tagName = %s, MX_RTU_Tag_Write = %d\r\n", modbusTags[i], rc);
}
}
break;
case 5:
free(modbusTagsTagInfo);
goto exit;
default:
printf("Invalid command...exit program!\r\n");
free(modbusTagsTagInfo);
goto exit;
}
}
exit:
printf("\r\nTag Uninit\r\n");
{
printf("MX_RTU_Tag_Uninit error = %d\r\n", retval);
}
else printf("Tag Uninit ok\r\n");
return 0;
}