ioPAC RTU Controllers
C/C++ Sample Code Programming Guide
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups
Functions
email_alarm_service.c File Reference

E-mail Alarm Application TAG Sample More...

#include "libmoxa_rtu.h"

Functions

void usage (void)
 
int main (int argc, char *argv[])
 

Detailed Description

E-mail Alarm Application TAG Sample

Date
01-24-2014
Author
TJ Tai
Version
V1.0
Introduction:
Send E-mail alarm by user-specific trigger value and support different alarm (DI/DO) report.
Example:
./email_alarm_service -t 1 -v 255
Help:
root@Moxa:/tmp#./email_alarm_service -h
E-mail Alarm program.

Usage: ./email_alarm_service [OPTIONS]

Options:
    -m        E-mail report mode with DO/DI value. Using with -m.  Default value: 0 [0: DO, 1: DI]
              Ex. ./email_alarm_service -t 1 
    -v        Alarm trigger value setting. Using with -v. Default value: 255 [Range: 0 ~ 255]
              Ex. ./email_alarm_service -v 128

Library:
TAG APIs

Function Documentation

void usage ( void  )
int main ( int  argc,
char *  argv[] 
)
/*******************************************************************************
* Copyright Moxa Inc.
*
* TAG Service for E-mail Alarm Application
*
* Date Author Comment
* 01-24-2014 TJ Tai Created.
******************************************************************************/
#include "libmoxa_rtu.h"
/*******************************************************************************
*
* Sample code for TAG E-mail Alarm Service
*
*******************************************************************************/
void usage(void)
{
printf("%s.\n\n", "E-mail Alarm Program");
printf("Usage: ./email_alarm_service [OPTIONS]\n\n");
printf("Options:\n");
printf("\t%-8s E-mail report mode with DO/DI value. Using with -m. Default value: 0 [0: DO, 1: DI]\n", "-m");
printf("\t Ex. ./email_alarm_service -m 1\n");
printf("\t%-8s Alarm trigger value setting. Using with -v. Default value: 255 [Range: 0 - 255]\n", "-v");
printf("\t Ex. ./email_alarm_service -v 128\n");
printf("\n");
}
int main(int argc, char * argv[])
{
int rc;
TAG_ERR_CODE retval = 0;
TAG_INFO tagInfo;
int i,j;
int a = 0;
int *edge_trigger_init = &a;
INT32 bitVal = 0;
int alarm_data;
unsigned int data = 1;
char c0[100];
char c1[100];
int triggerVal = 255; // default trigger value
char *tagName[] = {
"S0_DIO0_DOValue",
"S0_DIO1_DOValue",
"S0_DIO2_DOValue",
"S0_DIO3_DOValue",
"S0_DIO4_DOValue",
"S0_DIO5_DOValue",
"S0_DIO6_DOValue",
"S0_DIO7_DOValue"};
char *emailCtl[] = {
"Service_EmailAlarm_Status_0",
"Service_EmailAlarm_Trigger_0"};
while(-1 != (rc = getopt(argc, argv, "m:v:h")))
{
switch(rc)
{
case 'm':
i = atoi(optarg);
sprintf(c0, "Service_EmailAlarm_Status_%d", i);
sprintf(c1, "Service_EmailAlarm_Trigger_%d", i);
emailCtl[0] = c0; // status
emailCtl[1] = c1; // trigger
break;
case 'v':
triggerVal = atoi(optarg);
break;
case 'h':
case '?':
default:
usage();
return 0;
}
}
const int tagAmount = sizeof(tagName) / sizeof(char *);
retval = MX_RTU_Tag_Init();
if (retval != TAG_ERR_OK) {
printf("MX_RTU_Tag_Init(), return code = %d.\n", retval);
return 0;
}
// Simulate DO Input
char tagBuf[TAG_MAX_NAME_SIZE];
char triggerStat[1];
memset(tagBuf, 0, TAG_MAX_NAME_SIZE);
while (1) {
retval = MX_RTU_Tag_Get_Info(tagName[0], &tagInfo);
if (retval != TAG_ERR_OK) {
printf("MX_RTU_Tag_Get_Info(%s), return code = %d\n", tagName[0], retval);
break;
}
alarm_data = 0;
i = 0;
printf("\nDO0-DO7 output value [0-255]:");
scanf("%d", &data);
if ( data < 0 || data > 255)
{
printf("Input: %d : not in the range, wrong input.\n", data);
exit(1);
}
alarm_data = data;
memset(tagBuf, 0, TAG_MAX_NAME_SIZE);
while(data){
if (data & 1)
tagBuf[i] = 1;
else
tagBuf[i] = 0;
data >>= 1;
i++;
}
for (j = 0; j < tagAmount; j++) {
printf("DI[%d] = %d\n", j, tagBuf[j]);
}
for (j = 0; j < tagAmount; j++) {
retval = MX_RTU_Tag_Write(tagName[j], tagBuf+j, tagInfo.tagSize);
if (retval != TAG_ERR_OK) {
printf("MX_RTU_Tag_Write(%s), return code = %d\r\n", emailCtl[1], retval);
return 0;
}
}
// Trigger event handling
if (alarm_data == triggerVal && retval != 1) {
*triggerStat = 1;
retval = MX_RTU_Tag_Write(emailCtl[1], triggerStat, tagInfo.tagSize);
if (retval != TAG_ERR_OK) {
printf("MX_RTU_Tag_Write(%s), return code = %d\r\n", emailCtl[1], retval);
return 0;
}
while (1) {
retval = MX_RTU_Tag_Read(emailCtl[0], &bitVal, sizeof(bitVal), NULL, NULL);
if (retval != TAG_ERR_OK) {
printf("MX_RTU_Tag_Read(%s), return code = %d\r\n", emailCtl[0], retval);
return 0;
}
if (bitVal == 3) {
printf("Service success\n");
break;
}
else if (bitVal == 4) {
printf("Service fail\n");
break;
}
else {
printf("Service running\n");
sleep(10);
}
}
// Trigger reset to default
retval = MX_RTU_Tag_Write(emailCtl[1], edge_trigger_init, tagInfo.tagSize);
if (retval != TAG_ERR_OK) {
printf("MX_RTU_Tag_Write(%s), return code = %d\r\n", emailCtl[1], retval);
return 0;
}
}
sleep(1);
}
retval = MX_RTU_Tag_Uninit();
if (retval != TAG_ERR_OK) {
printf("MX_RTU_Tag_Uninit(), return code = %d\n", retval);
}
return 0;
}