ioPAC RTU Controllers
C/C++ Sample Code Programming Guide
Macros | Functions
di_event.c File Reference

DI Event More...

#include <libmoxa_rtu.h>

Macros

#define DEFAULT_OUT_NAME   "di_event.log"
 

Functions

int main (int argc, char **const argv)
 

Detailed Description

DI Event

Date
03-26-2013
Author
Wanhan Hsieh
Version
V1.0
Introduction:
To register a DI Event for a specific slot and channel and log Event Data into a file if the filter and trigger are matched.
Example:
1. Using default: ./di_event
2. Setting DI filter and trigger: ./di_event -f500 -t1
Default:
DI Slot = 1
DI Channel = 0
DI Filter = 1000 (One unit = 100us)
DI Trigger = 2 (L2H: 0, H2L: 1, BOTH: 2)
Logging file name = di_event.log
Help:
root@Moxa:/tmp#./di_event -h
DI event sample program.

Usage: ./di_event [OPTIONS]

Options:
        -s       Slot of DI module [1-9]. Default slot = 1
        -c       Channel of DI module [0-16]. Default channel = 0
        -f       Filter of DI module [1-2147483647]. Default filter = 1000
                   (One unit = 100us)
        -t       Trigger mode of DI counter [0,1,2]. Default mode = 2
                   (L2H: 0, H2L: 1, BOTH: 2)
        -o       Output file name. Default name = di_event.log

Library:
DIEvent APIs

Macro Definition Documentation

#define DEFAULT_OUT_NAME   "di_event.log"

Function Documentation

int main ( int  argc,
char **const  argv 
)
/*******************************************************************************
* Copyright Moxa Inc.
*
* DI Event Application
*
* Date Author Comment
* 03-26-2013 Wanhan Hsieh Created.
******************************************************************************/
#include <libmoxa_rtu.h>
#define DEFAULT_OUT_NAME "di_event.log"
/*******************************************************************************
*
* Sample code for DI event
*
******************************************************************************/
int main(int argc, char **const argv)
{
int rc, i;
UINT32 diSlot = 1, slotMin = 0, slotMax = 0;
int diChannelAmount = 16;
UINT32 filter = 1000, filterMin = 1, filterMax = 0x7FFFFFFF;
UINT8 eventTrigger = DI_EVENT_TOGGLE_BOTH;
UINT8 diChannel = 0;
char szOutFlieName[64];
FILE *pOutFile;
int handle = -1;
memset(szOutFlieName, 0, sizeof(szOutFlieName));
strncpy(szOutFlieName, DEFAULT_OUT_NAME, strlen(DEFAULT_OUT_NAME));
while(-1 != (rc = getopt(argc, argv, "hs:c:f:t:o:")))
{
switch(rc)
{
case 's':
diSlot = atoi(optarg);
if(diSlot < slotMin || diSlot > slotMax)
{
printf("Error parameter: slot: %d\n", diSlot);
return -1;
}
break;
case 'c':
diChannel = atoi(optarg);
if(diChannel < 0 || diChannel >= diChannelAmount)
{
printf("Error parameter: channel: %d\n", diChannel);
return -1;
}
break;
case 'f':
filter = atoi(optarg);
if(filter < filterMin)
filter = filterMin;
if(filter > filterMax)
filter = filterMin;
break;
case 't':
eventTrigger = atoi(optarg);
if(eventTrigger != DI_EVENT_TOGGLE_L2H && eventTrigger != DI_EVENT_TOGGLE_H2L
&& eventTrigger != DI_EVENT_TOGGLE_BOTH)
eventTrigger = DI_EVENT_TOGGLE_BOTH;
break;
case 'o':
memset(szOutFlieName, 0, sizeof(szOutFlieName));
strncpy(szOutFlieName, optarg, strlen(optarg));
break;
case '?':
case 'h':
default:
printf("DI event sample program.\n\n");
printf("Usage: ./di_event [OPTIONS]\n\n");
printf("Options:\n");
printf("\t%-8s Slot of DI module [%d-%d]. Default slot = %d\n",
"-s", slotMin, slotMax, diSlot);
printf("\t%-8s Channel of DI module [%d-%d]. Default channel = %d\n",
"-c", 0, diChannelAmount - 1, diChannel);
printf("\t%-8s Filter of DI module [%d-%d]. Default filter = %d\n",
"-f", filterMin, filterMax, filter);
printf("\t%-8s (One unit = 100us)\n", "");
printf("\t%-8s Trigger mode of DI counter [%d,%d,%d]. Default mode = %d\n",
DI_EVENT_TOGGLE_BOTH, eventTrigger);
printf("\t%-8s (L2H: %d, H2L: %d, BOTH: %d)\n",
printf("\t%-8s Output file name. Default name = %s\n",
"-o", szOutFlieName);
printf("\n");
return 0;
}
}
printf("%-10s: %d\n", "DI slot", diSlot);
printf("%-10s: %d\n", "DI channel", diChannel);
printf("%-10s: %d\n", "DI filter", filter);
printf("%-10s: %d\n", "DI trigger", eventTrigger);
printf("%-10s: %s\n", "output", szOutFlieName);
pOutFile = fopen(szOutFlieName, "w");
if(pOutFile == NULL)
{
fprintf(stderr, "Error open file: %s\n", szOutFlieName);
return -1;
}
// Config DI module
rc = MX_RTU_Module_DI_Filter_Set(diSlot, diChannel, 1, &filter);
if(rc != MODULE_RW_ERR_OK)
printf("MX_RTU_Module_DI_Filter_Set(%d, %d, %d), return code = %d.\n",
diSlot, diChannel, 1, rc);
if(rc != MODULE_RW_ERR_OK)
printf("MX_RTU_DI_Event_Reset(), return code = %d.\n", rc);
rc = MX_RTU_DI_Event_Register(diSlot, diChannel, eventTrigger, &handle);
if(rc != MODULE_RW_ERR_OK)
printf("MX_RTU_DI_Event_Register(%d, %d, %d), return code = %d.\n",
diSlot, diChannel, eventTrigger, rc);
// Start to polling DI event
while(1)
{
UINT32 count = 0;
rc = MX_RTU_DI_Event_Count(handle, &count);
if(rc != MODULE_RW_ERR_OK)
{
printf("MX_RTU_DI_Event_Count(%d), return code = %d.\n", handle, rc);
break;
}
while(count--)
{
UINT32 status = 0;
struct Timestamp time;
char szLine[64];
rc = MX_RTU_DI_Event_Get(handle, &status, &time);
if(rc != MODULE_RW_ERR_OK)
{
printf("MX_RTU_DI_Event_Get(%d), return code = %d.\n", handle, rc);
break;
}
sprintf(szLine, "%d/%d/%d %02d:%02d:%02d.%d\t%d\n",
time.year, time.mon, time.day, time.hour, time.min, time.sec, time.msec, status);
printf(szLine);
fprintf(pOutFile, szLine);
fflush(pOutFile);
}
}
fclose(pOutFile);
if(rc != MODULE_RW_ERR_OK)
printf("MX_RTU_DI_Event_Unregister(%d), return code = %d.\n", handle, rc);
return 0;
}