{
int count = 3;
char *pch;
while(count)
{
pch = strstr(pch, ".");
if(pch == NULL) return -1;
pch++;
count--;
}
return 0;
}
UINT8
doWriteCallback(UINT8 *tagName, UINT16 tagValueType, UINT8 *tagValue)
{
UINT32 rc = 0;
char *pch;
char num[2];
UINT8 doSlot = 0;
UINT8 doChannel = 0;
memset(num, 0, sizeof(num));
pch = strstr(tagName, "-");
num[0] = *(pch + 1);
doSlot = atoi(num);
memset(num, 0, sizeof(num));
pch = strstr(pch + 1, "-");
strncpy(num, pch + 1, strlen(pch + 1));
doChannel = atoi(num);
if(*tagValue)
{
DOChannelValue = 1;
DOOutputValue |= (1 << doChannel);
}
else
{
DOChannelValue = 0;
DOOutputValue &= ~(1 << doChannel);
}
{
printf("MX_RTU_Module_DO_Value_Set(%d, %x), return code = %d\r\n", doSlot, DOOutputValue, rc);
}
}
int main(
int argc,
char *argv[])
{
char ch = 0;
char chIgnore = 0;
char retry = 3;
int retval = 0;
UINT32 rc = 0;
UINT8 ip[17];
char ipFlag = 0;
UINT32 heartBeatS = 30;
UINT32 timeoutMs = 5 * 1000;
UINT32 sHandle = 0;
UINT8 doSlot = 1;
UINT8 doChannel = 0;
UINT8 aiSlot = 2;
UINT8 aiChannel = 0;
float aiValue = 0.0;
while((retval = getopt(argc, argv, "hi:p:b:s:c:S:C:")) != -1)
{
switch(retval)
{
case 'i':
{
printf("Invalid IP\r\n");
exit(1);
}
strcpy(ip, optarg);
ipFlag = 1;
break;
case 'p':
port = atoi(optarg);
break;
case 'b':
heartBeatS = atoi(optarg);
break;
case 's':
doSlot = atoi(optarg);
{
printf("Error DO slot = %d\r\n", doSlot);
exit(1);
}
break;
case 'c':
doChannel = atoi(optarg);
{
printf("Error DO channel = %d\r\n", doChannel);
exit(1);
}
break;
case 'S':
aiSlot = atoi(optarg);
{
printf("Error AI slot = %d\r\n", aiSlot);
exit(1);
}
break;
case 'C':
aiChannel = atoi(optarg);
{
printf("Error AI channel = %d\r\n", aiChannel);
exit(1);
}
break;
case '?':
case 'h':
default:
printf("AOPC I/O Update.\n\n");
printf("Usage: ./aopc_io_update [OPTIONS]\n\n");
printf("Options:\n");
printf("\t%-8s IP\n", "-i");
printf("\t%-8s Port [%d-%d]. Default port = %d\n", "-p", 0, 65535, port);
printf("\t%-8s HeartBeat [%d-%u]. Default heartbeat = %d seconds\n", "-b", 0, 0xFFFFFFFF, heartBeatS);
printf(
"\t%-8s DO slot [%d-%d]. Default DO slot = %d\n",
"-s", 0,
MAX_SLOT, doSlot);
printf("\t%-8s (slot 0: Built-in IO, slot 1 ~ 9: IO Module)\n", "");
printf(
"\t%-8s DO channel [%d-%d]. Default DO channel = %d\n",
"-c", 0,
MAX_CHANNEL, doChannel);
printf(
"\t%-8s AI slot [%d-%d]. Default AI slot = %d\n",
"-S", 0,
MAX_SLOT, aiSlot);
printf("\t%-8s (slot 0: Built-in IO, slot 1 ~ 9: IO Module)\n", "");
printf(
"\t%-8s AI channel [%d-%d]. Default AI channel = %d\n",
"-C", 0,
MAX_CHANNEL, aiChannel);
printf("\n");
return 0;
}
}
if(ipFlag == 0)
{
printf("No IP\r\n");
exit(1);
}
{
printf("MX_RTU_AOPC_Init(), return code = %d\r\n", rc);
exit(1);
}
memset(deviceName, 0, sizeof(deviceName));
strcpy(deviceName, "Moxa RTU");
{
printf("MX_RTU_AOPC_Connect(%s, %d, %s, %d, %d, &sHandle), return code = %d\r\n", deviceName, heartBeatS, ip, port, timeoutMs, rc);
exit(1);
}
{
printf("MX_RTU_AOPC_DelAllTag(%d, %d), return code = %d\r\n", sHandle, timeoutMs, rc);
exit(1);
}
{
printf("MX_RTU_Module_DO_Value_Get(%d, &DOOutputValue), return code = %d\r\n", doSlot, rc);
exit(1);
}
else
{
if(DOOutputValue & (1 << doChannel)) DOChannelValue = 1;
else DOChannelValue = 0;
}
{
printf("MX_RTU_Module_AI_Eng_Value_Get(%d, %d, %d, &aiValue, &time), return code = %d\r\n", aiSlot, aiChannel, 1, rc);
exit(1);
}
memset(&boolTagInfo, 0, sizeof(boolTagInfo));
sprintf((
char*)boolTagInfo.
strTagName,
"do-%d-%d", doSlot, doChannel);
boolTagInfo.
tagValue = (
void *)&DOChannelValue;
memset(&floatTagInfo, 0, sizeof(floatTagInfo));
sprintf((
char*)floatTagInfo.
strTagName,
"ai-%d-%d", aiSlot, aiChannel);
floatTagInfo.
tagValue = (
void *)&aiValue;
{
printf("MX_RTU_AOPC_AddTag(%d, &boolTagInfo, %d), return code = %d\r\n", sHandle, timeoutMs, rc);
exit(1);
}
{
printf("MX_RTU_AOPC_AddTag(%d, &floatTagInfo, %d), return code = %d\r\n", sHandle, timeoutMs, rc);
exit(1);
}
printf("Please keyin 'u' to update AI.\r\n");
ch = getchar();
while(1)
{
chIgnore = getchar();
if(chIgnore == 0xa) break;
}
if(ch == 'u')
{
{
printf("MX_RTU_Module_AI_Eng_Value_Get(%d, %d, %d, &aiValue, &time), return code = %d\r\n", aiSlot, aiChannel, 1, rc);
exit(1);
}
while(retry--)
{
{
{
printf("MX_RTU_AOPC_Reconnect(%d, %d), return code = %d\r\n", sHandle, timeoutMs, rc);
exit(1);
}
if(retry == 0)
{
printf("Retry fail!\r\n");
exit(1);
}
continue;
}
{
printf(
"MX_RTU_AOPC_UpdateValue(%d, %s, %f, %d), return code = %d\r\n", sHandle, floatTagInfo.
strTagName, aiValue, timeoutMs, rc);
exit(1);
}
else
{
printf("Please check AI value of AOPC Server, and press 'Enter' to exit.\r\n");
ch = getchar();
break;
}
}
}
{
printf(
"MX_RTU_AOPC_DelTag(%d, %s, %d), return code = %d\r\n", sHandle, boolTagInfo.
strTagName, timeoutMs, rc);
exit(1);
}
{
printf(
"MX_RTU_AOPC_DelTag(%d, %s, %d), return code = %d\r\n", sHandle, floatTagInfo.
strTagName, timeoutMs, rc);
exit(1);
}
return 0;
}