ioPAC RTU Controllers
C/C++ Sample Code Programming Guide
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
libmoxa_rtu.h
Go to the documentation of this file.
1 /*******************************************************************************
2  * Copyright Moxa Inc.
3  *
4  * Moxa Library
5  *
6  * Date Author Comment
7  * 04-10-2013 Eddy Kao Created.
8  ******************************************************************************/
9 
19 #ifndef _MOXA_RTU_H
20 #define _MOXA_RTU_H
21 
22 #ifdef __cplusplus
23 extern "C"{
24 #endif
25 
26 #include <stdio.h>
27 #include <stdlib.h>
28 #include <string.h>
29 #include <stdarg.h>
30 #include <unistd.h>
31 #include <fcntl.h>
32 #include <errno.h>
33 #include <termios.h>
34 #include <time.h>
35 #include <pthread.h>
36 #include <arpa/inet.h>
37 #include <asm/ioctls.h>
38 #include <linux/rtc.h>
39 #include <netinet/in.h>
40 #include <net/if.h>
41 #include <semaphore.h>
42 #include <mqueue.h>
43 #include<dirent.h>
44 #include <sys/socket.h>
45 #include <sys/stat.h>
46 #include <sys/ioctl.h>
47 #include <sys/types.h>
48 #include <sys/ipc.h>
49 #include <sys/sem.h>
50 #include <sys/time.h>
51 #include<sys/wait.h>
52 
58 typedef unsigned long UINT32;
59 typedef long INT32;
60 typedef unsigned short UINT16;
61 typedef short INT16;
62 typedef unsigned char UINT8;
63 typedef char INT8;
64 
65 #define USB_VID_MOXA 0x110a //Moxa
66 
67 /* I/O Module */
68 #define USB_PID_RTU_85M_1602 0x5200 //16ch, DI
69 #define USB_PID_RTU_85M_2600 0x5240 //16ch, DO
70 #define USB_PID_RTU_85M_3800 0x52c0 //8ch, 4-20mA
71 #define USB_PID_RTU_85M_3810 0x52c1 //8ch, 0-10V
72 #define USB_PID_RTU_85M_3801 0x5300 //8ch, 5KHz 4-2-mA
73 #define USB_PID_RTU_85M_3811 0x5301 //8ch, 5KHz 0-10V
74 #define USB_PID_RTU_85M_6810 0x5340 //8ch, TC
75 #define USB_PID_RTU_85M_6600 0x5380 //6ch, RTD
76 #define USB_PID_RTU_AIO_8di_8dio_8ai 0x50e0 //all-in-one module
77 
78 /* Communication Module */
79 #define USB_PID_RTU_85M_5401 0x53e0 //Serial
80 #define USB_PID_RTU_85M_5220 0x53e1 //IBIS
81 #define USB_PID_RTU_85M_5142 0x53e2 //HSPA
82 #define USB_PID_RTU_85M_5130 0x53e3 //WIFI
83 
84 #define MAX_SLOT 9
85 #define MAX_CHANNEL 24
86 
87 /*********************************************IO*********************************************/
88 typedef enum
89 {
90  IO_ERR_OK = 0,
119 } IO_ERR_CODE;
120 
121 typedef enum
122 {
159 
160 typedef enum
161 {
167 
168 struct IO_Info {
169  UINT8 di_channels;
170  UINT8 do_channels;
172  UINT8 ai_channels;
174  UINT8 ao_channels;
175  UINT8 tc_channels;
179 } __attribute__((packed));
181 struct Module_Info {
182  UINT8 slot;
183  UINT8 unit_id;
184  UINT16 vendor_id;
185  UINT16 product_id;
186  UINT32 serial_number;
187  UINT16 hw_version;
188  UINT16 fw_version;
189  struct IO_Info io_info;
190 } __attribute__((packed));
192 struct Timestamp {
193  UINT32 msec;
194  UINT32 sec;
195  UINT32 min;
196  UINT32 hour;
197  UINT32 day;
198  UINT32 mon;
199  UINT32 year;
200 } __attribute__((packed));
202 //--------------------------------------------------------------------------------------------------------
211 //ETHERNET ADAPTER TYPE
212 #define ETHERNET_ADAPTER_RJ45 0
213 #define ETHERNET_ADAPTER_M12 1
214 
215 
219 #define SRAM_START_ADDRESS 0x0
220 #define SRAM_END_ADDRESS 0x20000 //128KB
221 
222 
236 IO_ERR_CODE MX_RTU_Module_Info_Get(UINT8 slot, struct Module_Info *module_info);
246 IO_ERR_CODE MX_RTU_Slot_Inserted_Get(UINT32 *state); //Example: 0x6 -> slot 1 and 2 are inserted
251 IO_ERR_CODE MX_RTU_Ethernet_Adapter_Type_Get(UINT32 *type); //ETHERNET ADAPTER TYPE
253 
268 IO_ERR_CODE MX_RTU_SRAM_Read(UINT32 start_address, UINT32 length, UINT8 *buf);
275 IO_ERR_CODE MX_RTU_SRAM_Write(UINT32 start_address, UINT32 length, UINT8 *buf);
278 //--------------------------------------------------------------------------------------------------------
288 #define IO_EVENT_QUEUE_MAX 100
289 
293 //DI EVENT TRIGGER CONDITION
294 #define DI_EVENT_TOGGLE_L2H 0
295 #define DI_EVENT_TOGGLE_H2L 1
296 #define DI_EVENT_TOGGLE_BOTH 2
297 
298 
302 //AI EVENT TRIGGER CONDITION
303 #define AI_TC_RTD_EVENT_GREATER 0
304 #define AI_TC_RTD_EVENT_SMALLER 1
305 #define AI_TC_RTD_EVENT_EQUAL 2
306 
307 
324 IO_ERR_CODE MX_RTU_DI_Event_Register(UINT8 slot, UINT8 channel, UINT32 trigger, int *handle); //DI EVENT TRIGGER CONDITION
338 IO_ERR_CODE MX_RTU_DI_Event_Get(int handle, UINT32 *status, struct Timestamp *time);
344 IO_ERR_CODE MX_RTU_DI_Event_Set_Trigger(int handle, UINT32 trigger); //DI EVENT TRIGGER CONDITION
350 IO_ERR_CODE MX_RTU_DI_Event_Get_Trigger(int handle, UINT32 *trigger); //DI EVENT TRIGGER CONDITION
356 IO_ERR_CODE MX_RTU_DI_Event_Count(int handle, UINT32 *count);
371 
382 
383 IO_ERR_CODE MX_RTU_DIO_DI_Event_Register(UINT8 slot, UINT8 channel, UINT32 trigger, int *handle); //DI EVENT TRIGGER CONDITION
387 IO_ERR_CODE MX_RTU_DIO_DI_Event_Get(int handle, UINT32 *status, struct Timestamp *time);
389 IO_ERR_CODE MX_RTU_DIO_DI_Event_Set_Trigger(int handle, UINT32 trigger); //DI EVENT TRIGGER CONDITION
391 IO_ERR_CODE MX_RTU_DIO_DI_Event_Get_Trigger(int handle, UINT32 *trigger); //DI EVENT TRIGGER CONDITION
393 IO_ERR_CODE MX_RTU_DIO_DI_Event_Count(int handle, UINT32 *count);
399 
417 IO_ERR_CODE MX_RTU_AI_Event_Register(UINT8 slot, UINT8 channel, float value, UINT32 condition, int *handle); //AI EVENT TRIGGER CONDITION
431 IO_ERR_CODE MX_RTU_AI_Event_Get(int handle, float *value, struct Timestamp *time);
438 IO_ERR_CODE MX_RTU_AI_Event_Set_Value(int handle, float value, UINT32 condition); //AI EVENT TRIGGER CONDITION
445 IO_ERR_CODE MX_RTU_AI_Event_Get_Value(int handle, float *value, UINT32 *condition); //AI EVENT TRIGGER CONDITION
451 IO_ERR_CODE MX_RTU_AI_Event_Count(int handle, UINT32 *count);
466 
470 IO_ERR_CODE MX_RTU_TC_Event_Register(UINT8 slot, UINT8 channel, float value, UINT32 condition, int *handle); //AI EVENT TRIGGER CONDITION
472 IO_ERR_CODE MX_RTU_TC_Event_Get(int handle, float *value, struct Timestamp *time);
473 IO_ERR_CODE MX_RTU_TC_Event_Set_Value(int handle, float value, UINT32 condition); //AI EVENT TRIGGER CONDITION
474 IO_ERR_CODE MX_RTU_TC_Event_Get_Value(int handle, float *value, UINT32 *condition); //AI EVENT TRIGGER CONDITION
475 IO_ERR_CODE MX_RTU_TC_Event_Count(int handle, UINT32 *count);
479 
483 IO_ERR_CODE MX_RTU_RTD_Event_Register(UINT8 slot, UINT8 channel, float value, UINT32 condition, int *handle); //AI EVENT TRIGGER CONDITION
485 IO_ERR_CODE MX_RTU_RTD_Event_Get(int handle, float *value, struct Timestamp *time);
486 IO_ERR_CODE MX_RTU_RTD_Event_Set_Value(int handle, float value, UINT32 condition); //AI EVENT TRIGGER CONDITION
487 IO_ERR_CODE MX_RTU_RTD_Event_Get_Value(int handle, float *value, UINT32 *condition); //AI EVENT TRIGGER CONDITION
488 IO_ERR_CODE MX_RTU_RTD_Event_Count(int handle, UINT32 *count);
493 //--------------------------------------------------------------------------------------------------------
517 //DI MODE
518 #define DI_MODE_DI 0
519 #define DI_MODE_COUNTER 1
520 
521 
526 //DI COUNTER TRIGGER CONDITION
527 #define DI_TOGGLE_L2H 0
528 #define DI_TOGGLE_H2L 1
529 #define DI_TOGGLE_BOTH 2
530 
531 
539 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Value_Get(UINT8 slot, UINT32 *value, struct Timestamp *time);
540 
548 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Mode_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
549 
560 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Filter_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
561 
569 
577 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Counter_Trigger_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
578 
587 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Counter_Value_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf, struct Timestamp *time);
588 
596 
604 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Mode_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
605 
616 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Filter_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
617 
625 
633 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Counter_Trigger_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
634 
642 MODULE_RW_ERR_CODE MX_RTU_Module_DI_Counter_Value_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
643 
652 
653 //--------------------------------------------------------------------------------------------------------
668 //DO MODE
669 #define DO_MODE_DO 0
670 #define DO_MODE_PWM 1
671 
672 
680 
688 MODULE_RW_ERR_CODE MX_RTU_Module_DO_Mode_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
689 
690 /*
691  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
692  \param[in] start The first channel to get.
693  \param[in] count The number of channels to get.
694  \param[out] buf The DO PWM <b>LOW</b> signal width for the corresponding channels, Low = On.
695  \li ioPAC 8500: One unit = 100us.
696  \li ioPAC 5542: One unit = 500us.
697  \li ioPAC 5542-HSPA: One unit = 500us.
698  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
699 */
700 MODULE_RW_ERR_CODE MX_RTU_Module_DO_SigW_L_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
701 
702 /*
703  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
704  \param[in] start The first channel to get.
705  \param[in] count The number of channels to get.
706  \param[out] buf The DO PWM <b>HIGH</b> signal width for the corresponding channels, High = Off.
707  \li ioPAC 8500: One unit = 100us.
708  \li ioPAC 5542: One unit = 500us.
709  \li ioPAC 5542-HSPA: One unit = 500us.
710  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
711 */
712 MODULE_RW_ERR_CODE MX_RTU_Module_DO_SigW_H_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
713 
721 
729 MODULE_RW_ERR_CODE MX_RTU_Module_DO_PWM_Count_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
730 
739 MODULE_RW_ERR_CODE MX_RTU_Module_DO_PWM_Config_Get(UINT8 slot, UINT8 start, UINT8 count, float *frequency, float *dutyCycle);
740 
748 
756 MODULE_RW_ERR_CODE MX_RTU_Module_DO_Mode_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //DO MODE
757 
758 /*
759  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
760  \param[in] start The first channel to set.
761  \param[in] count The number of channels to set.
762  \param[in] buf The DO PWM <b>LOW</b> signal width for the corresponding channels, Low = On.
763  \li ioPAC 8500: One unit = 100us.
764  \li ioPAC 5542: One unit = 500us.
765  \li ioPAC 5542-HSPA: One unit = 500us.
766  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
767 */
768 MODULE_RW_ERR_CODE MX_RTU_Module_DO_SigW_L_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
769 
770 /*
771  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
772  \param[in] start The first channel to set.
773  \param[in] count The number of channels to set.
774  \param[in] buf The DO PWM <b>HIGH</b> signal width for the corresponding channels, High = Off.
775  \li ioPAC 8500: One unit = 100us.
776  \li ioPAC 5542: One unit = 500us.
777  \li ioPAC 5542-HSPA: One unit = 500us.
778  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
779 */
780 MODULE_RW_ERR_CODE MX_RTU_Module_DO_SigW_H_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
781 
789 
797 
805 MODULE_RW_ERR_CODE MX_RTU_Module_DO_PWM_Count_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
806 
815 MODULE_RW_ERR_CODE MX_RTU_Module_DO_PWM_Config_Set(UINT8 slot, UINT8 start, UINT8 count, float *frequency, float *dutyCycle);
816 
818 
819 //--------------------------------------------------------------------------------------------------------
820 
821 //RELAY MODE
822 #define RELAY_MODE_RELAY 0
823 #define RELAY_MODE_PWM 1
824 
826 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_Mode_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //RELAY MODE
827 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_SigW_L_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
828 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_SigW_H_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
830 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_PWM_Count_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
831 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_Total_Count_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
832 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_Current_Count_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
833 
835 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_Mode_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //RELAY MODE
836 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_SigW_L_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
837 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_SigW_H_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
840 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_PWM_Count_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
841 MODULE_RW_ERR_CODE MX_RTU_Module_Relay_Current_Count_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
842 
843 //--------------------------------------------------------------------------------------------------------
868 
876 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Value_Get(UINT8 slot, UINT32 *value, struct Timestamp *time);
884 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Mode_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
895 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Filter_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
910 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Counter_Trigger_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
919 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Counter_Value_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf, struct Timestamp *time);
927 
935 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Mode_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
946 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Filter_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
961 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Counter_Trigger_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
969 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DI_Counter_Value_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
977 
978 /* Same as DO*/
993 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_Mode_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
994 /*
995  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
996  \param[in] start The first channel to get.
997  \param[in] count The number of channels to get.
998  \param[out] buf The DO PWM <b>LOW</b> signal width for the corresponding channels, Low = On.
999  \li ioPAC 8500: One unit = 100us.
1000  \li ioPAC 5542: One unit = 500us.
1001  \li ioPAC 5542-HSPA: One unit = 500us.
1002  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
1003 */
1004 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_SigW_L_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1005 /*
1006  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
1007  \param[in] start The first channel to get.
1008  \param[in] count The number of channels to get.
1009  \param[out] buf The DO PWM <b>HIGH</b> signal width for the corresponding channels, High = Off.
1010  \li ioPAC 8500: One unit = 100us.
1011  \li ioPAC 5542: One unit = 500us.
1012  \li ioPAC 5542-HSPA: One unit = 500us.
1013  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
1014 */
1015 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_SigW_H_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1030 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_PWM_Count_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1031 
1040 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_PWM_Config_Get(UINT8 slot, UINT8 start, UINT8 count, float *frequency, float *dutyCycle);
1041 
1042 /* Same as DO*/
1057 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_Mode_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
1058 /*
1059  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
1060  \param[in] start The first channel to set.
1061  \param[in] count The number of channels to set.
1062  \param[in] buf The DO PWM <b>LOW</b> signal width for the corresponding channels, Low = On.
1063  \li ioPAC 8500: One unit = 100us.
1064  \li ioPAC 5542: One unit = 500us.
1065  \li ioPAC 5542-HSPA: One unit = 500us.
1066  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
1067 */
1068 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_SigW_L_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1069 /*
1070  \param[in] slot slot 0: Built-in IO Ports, slot 1 ~ 9: Expansion IO Ports.
1071  \param[in] start The first channel to set.
1072  \param[in] count The number of channels to set.
1073  \param[in] buf The DO PWM <b>HIGH</b> signal width for the corresponding channels, High = Off.
1074  \li ioPAC 8500: One unit = 100us.
1075  \li ioPAC 5542: One unit = 500us.
1076  \li ioPAC 5542-HSPA: One unit = 500us.
1077  \return \link MODULE_RW_ERR_CODE MODULE_RW_ERR_CODE \endlink
1078 */
1079 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_SigW_H_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1101 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_PWM_Count_Set(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1102 
1111 MODULE_RW_ERR_CODE MX_RTU_Module_DIO_DO_PWM_Config_Set(UINT8 slot, UINT8 start, UINT8 count, float *frequency, float *dutyCycle);
1112 
1114 //--------------------------------------------------------------------------------------------------------
1129 //AI RANGE
1130 //#define AI_RANGE_5V 0 //not support
1131 #define AI_RANGE_10V 1
1132 #define AI_RANGE_0_10V 2
1133 #define AI_RANGE_0_20mA 3
1134 #define AI_RANGE_4_20mA 4
1135 
1136 
1141 //AI STATUS
1142 #define AI_STATUS_BURNOUT 0
1143 #define AI_STATUS_UNDER_RANGE 1
1144 #define AI_STATUS_NORMAL_RANGE 2
1145 #define AI_STATUS_OVER_RANGE 3
1146 
1147 
1154 AI_TRANSFORM_ERR_CODE MX_RTU_AI_Raw_to_Eng(UINT32 range, int raw_value, float *eng_value);
1155 
1162 AI_TRANSFORM_ERR_CODE MX_RTU_AI_Eng_to_Raw(UINT32 range, float eng_value, int *raw_value);
1163 
1172 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Raw_Value_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf, struct Timestamp *time);
1173 
1182 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Eng_Value_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf, struct Timestamp *time);
1183 
1191 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Range_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //AI RANGE
1192 
1200 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Min_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1201 
1209 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Max_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1210 
1218 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Min_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1219 
1227 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Max_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1228 
1237 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Burnout_Value_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1238 
1247 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Status_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
1248 
1256 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Range_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
1257 
1266 
1275 
1284 
1293 
1302 MODULE_RW_ERR_CODE MX_RTU_Module_AI_Burnout_Value_Set(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1304 
1305 //--------------------------------------------------------------------------------------------------------
1315 #define FAST_AI_BATCH_DATA_SIZE 60*1000
1316 
1325 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Raw_Value_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf, struct Timestamp *time);
1326 
1335 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Eng_Value_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf, struct Timestamp *time);
1336 
1344 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Range_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
1345 
1353 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Min_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1354 
1362 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Max_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1363 
1371 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Min_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1372 
1380 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Max_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1381 
1390 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Burnout_Value_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1391 
1400 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Status_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
1401 
1409 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Range_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf);
1410 
1419 
1428 
1437 
1446 
1455 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Burnout_Value_Set(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1456 
1464 
1473 
1485 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Batch_Data_Get(UINT8 slot, UINT32 channel, UINT32 fore_interval, UINT32 back_interval, UINT8 *buf, struct Timestamp *time);
1486 
1494 
1502 
1512 MODULE_RW_ERR_CODE MX_RTU_Module_Fast_AI_Trigger_Set(UINT8 slot, UINT32 channel_trigger, UINT32 fore_interval, UINT32 back_interval, UINT32 *required_buf_size);
1514 
1515 //--------------------------------------------------------------------------------------------------------
1516 
1517 //TC TYPE
1518 #define TC_TYPE_J 0 //(0 to 750¢XC)
1519 #define TC_TYPE_K 1 //(-200 to 1250¢XC)
1520 #define TC_TYPE_T 2 //(-200 to 350¢XC)
1521 #define TC_TYPE_E 3 //(-200 to 900¢XC)
1522 #define TC_TYPE_R 4 //(-50 to 1600¢XC)
1523 #define TC_TYPE_S 5 //(-50 to 1760¢XC)
1524 #define TC_TYPE_B 6 //(600 to 1700¢XC)
1525 #define TC_TYPE_N 7 //(-200 to 1300¢XC)
1526 
1527 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Raw_Value_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf, struct Timestamp *time);
1528 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Eng_Value_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf, struct Timestamp *time);
1529 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Type_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //TC TYPE
1530 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Min_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1531 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Max_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1532 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Min_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1533 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Max_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1534 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Burnout_Status_Get(UINT8 slot, UINT32 *status); //AI STATUS
1535 
1536 MODULE_RW_ERR_CODE MX_RTU_Module_TC_Type_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //TC TYPE
1541 
1542 //--------------------------------------------------------------------------------------------------------
1543 
1544 //RTD TYPE
1545 #define RTD_TYPE_PT50 0 //(-200 to 850¢XC)
1546 #define RTD_TYPE_PT100 1 //(-200 to 850¢XC)
1547 #define RTD_TYPE_PT200 2 //(-200 to 850¢XC)
1548 #define RTD_TYPE_PT500 3 //(-200 to 850¢XC)
1549 #define RTD_TYPE_PT1000 4 //(-200 to 350¢XC)
1550 #define RTD_TYPE_JPT100 5 //(-200 to 640¢XC)
1551 #define RTD_TYPE_JPT200 6 //(-200 to 640¢XC)
1552 #define RTD_TYPE_JPT500 7 //(-200 to 640¢XC)
1553 #define RTD_TYPE_JPT1000 8 //(-200 to 350¢XC)
1554 #define RTD_TYPE_NI100 9 //(-60 to 250¢XC)
1555 #define RTD_TYPE_NI200 10 //(-60 to 250¢XC)
1556 #define RTD_TYPE_NI500 11 //(-60 to 250¢XC)
1557 #define RTD_TYPE_NI1000 12 //(-60 to 150¢XC)
1558 #define RTD_TYPE_NI120 13 //(-80 to 260¢XC)
1559 
1560 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Raw_Value_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf, struct Timestamp *time);
1561 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Eng_Value_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf, struct Timestamp *time);
1562 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Type_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //RTD TYPE
1563 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Min_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1564 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Max_Raw_Get(UINT8 slot, UINT8 start, UINT8 count, UINT32 *buf);
1565 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Min_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1566 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Max_Eng_Get(UINT8 slot, UINT8 start, UINT8 count, float *buf);
1567 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Burnout_Status_Get(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //AI STATUS
1568 
1569 MODULE_RW_ERR_CODE MX_RTU_Module_RTD_Type_Set(UINT8 slot, UINT8 start, UINT8 count, UINT8 *buf); //RTD TYPE
1574 /********************************************************************************************/
1576 
1577 /********************************************Misc********************************************/
1596 //LED STATE
1597 #define LED_DARK 0
1598 #define LED_GREEN 1
1599 #define LED_RED 2
1600 
1601 
1605 #define SOFTWARE_WATCHDOG_MIN_TIME 50 // 50 msec
1606 #define SOFTWARE_WATCHDOG_MAX_TIME (60*1000) // 60 seconds
1607 
1608 
1609 typedef enum
1610 {
1622 } MISC_ERR_CODE;
1623 
1629 {
1630  int enable;
1631  unsigned int time;
1632 };
1634 
1648 MISC_ERR_CODE MX_RTU_RTC_Get(struct rtc_time *rtc);
1653 MISC_ERR_CODE MX_RTU_RTC_Set(struct rtc_time *rtc);
1655 
1668 MISC_ERR_CODE MX_RTU_SWTD_Enable(UINT32 swtdtime);
1683 
1696 MISC_ERR_CODE MX_RTU_LED1_Get(UINT8 *state); //LED STATE
1701 MISC_ERR_CODE MX_RTU_LED2_Get(UINT8 *state); //LED STATE
1706 MISC_ERR_CODE MX_RTU_LED1_Set(UINT8 state); //LED STATE
1711 MISC_ERR_CODE MX_RTU_LED2_Set(UINT8 state); //LED STATE
1713 
1726 MISC_ERR_CODE MX_RTU_Toggle_Switch_Get(UINT8 *state); //0: Mode1, 1: Mode 2
1728 
1741 MISC_ERR_CODE MX_RTU_Dual_Power1_Get(UINT8 *state); //0: power disconnect, 1: power connect
1746 MISC_ERR_CODE MX_RTU_Dual_Power2_Get(UINT8 *state); //0: power disconnect, 1: power connect
1748 
1755 UINT32 MX_RTU_API_Version_Get(void); //Example: 0x01000000 -> 1.0.0 , final byte is always 0
1759 UINT32 MX_RTU_API_BuildDate_Get(void); //Example: 0x0d03010e -> 2013.03.01-14:00:00
1763 UINT32 MX_RTU_System_Version_Get(void); //Example: 0x01000000 -> 1.0.0 , final byte is always 0
1767 UINT32 MX_RTU_System_BuildDate_Get(void); //Example: 0x0d03010e -> 2013.03.01-14:00:00
1772 IO_ERR_CODE MX_RTU_System_Hot_Plug_Connect_Get(UINT32 *state); //Example: 0x6 -> slot 1 and 2 are hot-plug connecting
1777 IO_ERR_CODE MX_RTU_System_Hot_Plug_Disconnect_Get(UINT32 *state); //Example: 0x6 -> slot 1 and 2 are hot-plug disconnecting
1783 MODULE_RW_ERR_CODE MX_RTU_Module_FWR_BuildDate_Get(UINT8 slot, UINT32 *date); // Format: (0x)YYMMDDHH
1786 /********************************************************************************************/
1787 
1788 /*******************************************Serial********************************************/
1802 //SERIAL MODE
1803 #define RS232_MODE 0
1804 #define RS485_2WIRE_MODE 1
1805 #define RS422_MODE 2
1806 #define RS485_4WIRE_MODE 3
1807 
1808 
1813 //SERIAL BAUD RATE
1814 #define BAUD_RATE_921600 921600
1815 #define BAUD_RATE_460800 460800
1816 #define BAUD_RATE_230400 230400
1817 #define BAUD_RATE_115200 115200
1818 #define BAUD_RATE_57600 57600
1819 #define BAUD_RATE_38400 38400
1820 #define BAUD_RATE_19200 19200
1821 #define BAUD_RATE_9600 9600
1822 #define BAUD_RATE_4800 4800
1823 #define BAUD_RATE_2400 2400
1824 #define BAUD_RATE_1800 1800
1825 #define BAUD_RATE_1200 1200
1826 #define BAUD_RATE_600 600
1827 #define BAUD_RATE_300 300
1828 
1829 
1834 //SERIAL DATA BITS
1835 #define SERIAL_DATA_BITS_5 5
1836 #define SERIAL_DATA_BITS_6 6
1837 #define SERIAL_DATA_BITS_7 7
1838 #define SERIAL_DATA_BITS_8 8
1839 
1840 
1845 //SERIAL PARITY
1846 #define SERIAL_PARITY_NONE 0
1847 #define SERIAL_PARITY_ODD 1
1848 #define SERIAL_PARITY_EVEN 2
1849 
1850 
1855 //SERIAL STOP BIT
1856 #define SERIAL_STOP_BIT_1 1
1857 #define SERIAL_STOP_BIT_2 2
1858 
1859 
1864 //SERIAL FLOW CONTROL
1865 #define NO_FLOW_CONTROL 0
1866 #define HW_FLOW_CONTROL 1
1867 #define SW_FLOW_CONTROL 2
1868 
1869 
1870 #define MX_RTU_SerialRead MX_RTU_SerialBlockRead
1871 
1872 #define SERIAL_MAX_OQUEUE_LENGTH 4095
1873 
1874 typedef enum
1875 {
1876  PORT1 = 0,
1885 } SERIAL_PORT;
1886 
1887 typedef enum
1888 {
1906 } SERIAL_ERR_CODE;
1907 
1914 
1923 SERIAL_ERR_CODE MX_RTU_SerialWrite( UINT8 slot, SERIAL_PORT port, UINT32 len, UINT8* str, UINT32 *write_bytes);
1924 
1935 SERIAL_ERR_CODE MX_RTU_SerialNonBlockRead( UINT8 slot, SERIAL_PORT port, UINT32 len, UINT8* buf, UINT32 *read_bytes);
1936 
1947 SERIAL_ERR_CODE MX_RTU_SerialBlockRead( UINT8 slot, SERIAL_PORT port, UINT32 len, UINT8* buf, UINT32 *read_bytes);
1948 
1955 
1962 SERIAL_ERR_CODE MX_RTU_SerialFlowControl( UINT8 slot, SERIAL_PORT port, UINT8 control); //SERIAL FLOW CONTROL
1963 
1970 SERIAL_ERR_CODE MX_RTU_SerialSetSpeed( UINT8 slot, SERIAL_PORT port, UINT32 speed); //SERIAL BAUD RATE
1971 
1978 SERIAL_ERR_CODE MX_RTU_SerialSetMode( UINT8 slot, SERIAL_PORT port, UINT8 mode); //SERIAL MODE
1979 
1986 SERIAL_ERR_CODE MX_RTU_SerialGetMode( UINT8 slot, SERIAL_PORT port, UINT8 *mode); //SERIAL MODE
1987 
1996 SERIAL_ERR_CODE MX_RTU_SerialSetParam( UINT8 slot, SERIAL_PORT port, UINT8 parity, UINT8 databits, UINT8 stopbit); //SERIAL PARITY, SERIAL DATA BITS, SERIAL STOP BIT
1997 
2005 
2015 
2024 
2033 
2040 SERIAL_ERR_CODE MX_RTU_FindFD( UINT8 slot, SERIAL_PORT port, INT32 *fd);
2042 /********************************************************************************************/
2043 
2044 /*******************************************Cellular*******************************************/
2058 #define MODEM_BRAND_PH8 1
2059 
2060 #define SIZE_PIN 4
2061 #define SIZE_APN 32
2062 #define SIZE_USERNAME 128
2063 #define SIZE_PASSWORD 128
2064 #define SIZE_HOSTNAME 128
2065 #define SIZE_IMEI 17
2066 
2067 //MODEM BAND
2068 #define MODEM_BAND_PH8_GSM900 1
2069 #define MODEM_BAND_PH8_GSM1800 2
2070 #define MODEM_BAND_PH8_GSM850 4
2071 #define MODEM_BAND_PH8_GSM1900 8
2072 #define MODEM_BAND_PH8_WCDMA2100 16
2073 #define MODEM_BAND_PH8_WCDMA1900 32
2074 #define MODEM_BAND_PH8_WCDMA850 64
2075 #define MODEM_BAND_PH8_WCDMA800 256
2076 #define MODEM_BAND_PH8_WCDMA1700 512
2077 #define MODEM_BAND_PH8_AUTO 895
2078 
2079 //MODEM STATE
2080 #define MODEM_STATE_INIT 0
2081 #define MODEM_STATE_READY 1
2082 #define MODEM_STATE_CONNECTING 2
2083 #define MODEM_STATE_CONNECTED 3
2084 #define MODEM_STATE_DISCONNECT 4
2085 
2086 //modem error code
2087 typedef enum
2088 {
2089  MODEM_ERR_OK = 0, //successfully
2090  MODEM_ERR_INIT, //not init
2091  MODEM_ERR_PARAM, //invalid parameter
2092  MODEM_ERR_OPEN, //open device error
2093  MODEM_ERR_SIM, //SIM card error
2094  MODEM_ERR_PIN, //PIN code error
2095  MODEM_ERR_BAND, //Set band error
2096  MODEM_ERR_ECHO_OFF, //turn off echo error
2097  MODEM_ERR_CELLULAR_DENIED, //register to cellular network is denied
2098  MODEM_ERR_RESET, //reset modem error
2099  MODEM_ERR_THREAD, //create thread error
2100  MODEM_ERR_APN, //set APN error
2101  MODEM_ERR_CREDENTIAL, //generate PPP credential file error
2102  MODEM_ERR_ATTACH, //attach to 3G network error
2103  MODEM_ERR_IF, //ppp interface is not established
2104  MODEM_ERR_CMD, //err command(wrong state, or previous cmd is executing)
2105  MODEM_ERR_TIMEOUT, //connect to 3G timeout(PPP)
2106  MODEM_ERR_STATE, //invalid cmd state
2107  MODEM_ERR_BREAK, //user break
2108  MODEM_ERR_SEM, //create named semaphore for modem failed
2109  MODEM_ERR_ttyUSB, //can't find ttyUSB of modem
2110  MODEM_ERR_SYSTEM_INFO, //can't get system info
2111  MODEM_ERR_NOT_SUPPORT_PRODUCT, //this product is not support cellular
2112  MODEM_ERR_GPS_SWITCH, //start/stop GPS function err
2113  MODEM_ERR_QUERY_REG, //query modem registration to station err
2115 } MODEM_ERR_CODE;
2116 
2117 typedef struct Check_Info
2118 {
2122  UINT32 pingMaxFail;
2123 }CheckInfo;
2124 
2146 MODEM_ERR_CODE MX_RTU_Cellular_Modem_Init(INT8 *pin, UINT32 band); //MODEM BAND
2147 
2161 MODEM_ERR_CODE MX_RTU_Cellular_Net_Start(INT8 *apn, INT8 *userName, INT8 *password, CheckInfo* autoCheck);
2162 
2170 
2177 MODEM_ERR_CODE MX_RTU_Cellular_Modem_Reset(void);//do not reset modem while MX_RTU_Cellular_Net_State()!=(MODEM_STATE_DISCONNECT|MODEM_STATE_READY)
2178 
2188 INT32 MX_RTU_Cellular_Net_State(void); //MODEM STATE
2189 
2196 
2201 void MX_RTU_Cellular_Modem_IMEI(INT8 *imei);
2202 
2207 void MX_RTU_Cellular_Set_Debug(UINT8 debug);
2210 /********************************************GPS********************************************/
2221 typedef struct Gps_Time
2222 {
2223  int year;
2224  int mon;
2225  int day;
2226  int hour;
2227  int min;
2228  int sec;
2229  int hsec;
2230 }GPS_TIME;
2231 
2232 typedef struct Gps_Data
2233 {
2234  //GPS info
2235  double lat;
2236  double lon;
2237  int fix;
2238  int satInUse;
2241 }GPS_DATA;
2242 
2248 INT32 MX_RTU_GPS_Start(UINT8 activeAntenna);
2249 
2253 INT32 MX_RTU_GPS_Stop(void);
2254 
2259 void MX_RTU_GPS_Get_Info(GPS_DATA *gpsData);
2261 /********************************************************************************************/
2262 
2263 /********************************************SMS********************************************/
2275 typedef enum
2276 {
2278  SMS_ERR_OPEN, //open modem device fail
2279  SMS_ERR_ERR, //send SMS fail
2280  SMS_ERR_PIN, //maybe it's a pin code err or SIM err
2281  SMS_ERR_PDU, //set modem to PDU mode
2282  SMS_ERR_MODEM, //check modem err
2283  SMS_ERR_LENGTH, //message exceeds the maximum limitation
2284  SMS_ERR_SYSTEM_INFO, //can't get system info
2285  SMS_ERR_NOT_SUPPORT_PRODUCT, //this product is not support sms
2286  SMS_ERR_ISP, //register to ISP station err
2288 } SMS_ERR_CODE;
2289 
2298 SMS_ERR_CODE MX_RTU_SMS_Send_Ascii(INT8 *phone, INT8 *pin, INT8 *asciiMsg, INT32 msgLength );//maximum message length is 160 bytes
2299 
2308 SMS_ERR_CODE MX_RTU_SMS_Send_Ucs2(INT8 *phone, INT8 *pin, INT8 *ucs2Msg, INT8 msgLength);//maximum message length is 140 bytes
2311 /********************************************************************************************/
2312 
2313 /****************************************Modbus Master****************************************/
2323 typedef enum
2324 {
2326  MODBUS_MASTER_ERR_PARAM, //invalid parameters
2327  MODBUS_MASTER_ERR_PORT, //invalid port
2328  MODBUS_MASTER_ERR_OPENED, //port is opened
2329  MODBUS_MASTER_ERR_NOT_OPENED, //port is not opened
2330  MODBUS_MASTER_ERR_UART_OPEN, //open uart device err
2331  MODBUS_MASTER_ERR_UART_CLOSE, //close uart device err
2332  MODBUS_MASTER_ERR_UART_BAUDRATE, //set uart baudrate err
2333  MODBUS_MASTER_ERR_UART_MODE, //set uart 232/422/485 mode err
2334  MODBUS_MASTER_ERR_UART_FORMAT, //set uart data format err
2335  MODBUS_MASTER_ERR_UART_FLOW, //set uart flow control err
2337  MODBUS_MASTER_ERR_RESP, //invalid modbus RTU response
2338  MODBUS_MASTER_ERR_CRC, //check response CRC error
2341  MODBUS_MASTER_ERR_CONNECT, //failed to connect to modbus server
2342  MODBUS_MASTER_ERR_HANDLE, //out of space for connection handle
2343  MODBUS_MASTER_ERR_EXP_ILLEGAL_FUNC, //modbus standard excpetion
2344  MODBUS_MASTER_ERR_EXP_ILLEGAL_ADDR, //modbus standard excpetion
2345  MODBUS_MASTER_ERR_EXP_ILLEGAL_VALUE, //modbus standard excpetion
2346  MODBUS_MASTER_ERR_EXP_DEVICE_FAIL, //modbus standard excpetion
2347  MODBUS_MASTER_ERR_EXP_ACK, //modbus standard excpetion
2348  MODBUS_MASTER_ERR_EXP_DEVICE_BUSY, //modbus standard excpetion
2349  MODBUS_MASTER_ERR_EXP_MEM_PARITY, //modbus standard excpetion
2350  MODBUS_MASTER_ERR_EXP_GATE_PATH, //modbus standard excpetion
2351  MODBUS_MASTER_ERR_EXP_GATE_DEVICE, //modbus standard excpetion
2352  MODBUS_MASTER_ERR_LIB_INIT, //please call MX_RTU_Modbus_Init() first
2353  MODBUS_MASTER_ERR_SYSTEM_INFO, //can't get system info
2357 
2363 
2367 void MX_RTU_Modbus_Master_Uninit(void);
2368 
2369 //-------------------RTU-------------------
2379 typedef struct
2380 {
2381  UINT32 baudrate;
2382  INT32 parity;
2383  INT32 databits;
2384  INT32 stopbit;
2385  INT32 mode;
2386  INT32 flowCtrl;
2387 }TTY_PARAM;
2388 
2396 
2403 
2404 //coil
2415 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Read_Coils(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 startAddr , UINT16 coilCount, UINT8 byteCoils[], UINT32 timeoutMs);
2416 
2427 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Write_Coils(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 startAddr, UINT16 coilCount, UINT8 byteCoils[], UINT32 timeoutMs);
2428 
2438 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Write_Coil(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 addr, UINT8 coil, UINT32 timeoutMs);
2439 
2440 //input discrete
2451 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Read_Discrete_Inputs(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 startAddr , UINT16 coilCount, UINT8 byteCoils[], UINT32 timeoutMs);
2452 
2453 //input register
2464 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Read_Input_Regs(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 startAddr, UINT16 regCount, UINT16 regs[], UINT32 timeoutMs);
2465 
2466 //holding register
2477 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Read_Holding_Regs(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 startAddr, UINT16 regCount, UINT16 regs[], UINT32 timeoutMs);
2478 
2489 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Write_Holding_Regs(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 startAddr, UINT16 regCount, UINT16 regs[], UINT32 timeoutMs);
2490 
2500 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Rtu_Master_Write_Holding_Reg(UINT8 slot, SERIAL_PORT port, UINT8 unitId, UINT16 addr, UINT16 reg, UINT32 timeoutMs);
2502 //-------------------TCP-------------------
2520 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Open(UINT8 ipAddress[], UINT16 tcpPort, UINT32 cTimeoutMs, UINT32 *sHandle);
2521 
2527 
2534 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Ioctl(UINT32 sHandle, UINT8 unitId, UINT32 rwTimeoutMs);
2535 //coil
2543 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Read_Coils(UINT32 sHandle, UINT16 startAddr , UINT16 coilCount, UINT8 byteCoils[]);
2551 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Write_Coils(UINT32 sHandle, UINT16 startAddr , UINT16 coilCount, UINT8 byteCoils[]);
2558 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Write_Coil(UINT32 sHandle, UINT16 addr , UINT8 coil);
2559 //input discrete inputs
2567 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Read_Discrete_Inputs(UINT32 sHandle, UINT16 startAddr , UINT16 coilCount, UINT8 byteCoils[]);
2568 //input register
2576 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Read_Input_Regs(UINT32 sHandle, UINT16 startAddr , UINT16 regCount, UINT16 regs[]);
2577 //holding register
2585 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Read_Holding_Regs(UINT32 sHandle, UINT16 startAddr , UINT16 regCount, UINT16 regs[]);
2593 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Write_Holding_Regs(UINT32 sHandle, UINT16 startAddr , UINT16 regCount, UINT16 regs[]);
2600 MODBUS_MASTER_ERR_CODE MX_RTU_Modbus_Tcp_Master_Write_Holding_Reg(UINT32 sHandle, UINT16 addr , UINT16 regValue);
2603 /********************************************************************************************/
2604 
2605 /***************************************Modbus TCP Slave***************************************/
2615 #define MAKE_WORD(a,b) (((UINT16)a<<8) +(UINT16)b)
2616 
2617 #define pfnModbusRead int (*pfnModRead)(UINT8 *pData, UINT16 nth, void *pUserData)
2618 #define pfnModbusWrite int (*pfnModWrite)(UINT8 *pData, UINT16 nth, void *pUserData)
2619 
2620 #define MODBUS_LISTEN_PORTS 1 //Only one port can be registered
2621 #define MODBUS_MAX_CONNECTION 10 //Maximum connections for each port
2622 
2623 #define MODBUS_MAX_MAP_SIZE 500 //Maximum entries for each Map Type
2624 #define MODBUS_MIN_IDLE_TIMEOUT_SECOND 10
2625 
2630 //Exception Code
2631 #define ILLEGAL_FUNCTION 0x01
2632 #define ILLEGAL_DATA_ADDRESS 0x02
2633 #define ILLEGAL_DATA_VALUE 0x03
2634 #define SLAVE_DEVICE_FAILURE 0x04
2635 #define SLAVE_DEVICE_BUSY 0x06
2636 
2637 
2642 //Return Code
2643 #define RETURN_OK 0
2644 #define RETURN_ERROR_ADDRESS 1
2645 #define RETURN_ERROR_FUNCTION 2
2646 #define RETURN_ERROR_VALUE 3
2647 
2648 
2653 //Function Code
2654 #define MODBUS_READ_COILS 0x01 //COIL
2655 #define MODBUS_READ_DISCRETE 0x02 //INPUT COIL
2656 #define MODBUS_READ_HOLDINGREGISTERS 0x03 //HOLDING REGISTER
2657 #define MODBUS_READ_INPUTREGISTERS 0x04 //INPUT REGISTER
2658 #define MODBUS_WRITE_COIL 0x05 //COIL
2659 #define MODBUS_WRITE_REGISTER 0x06 //HOLDING REGISTER
2660 #define MODBUS_WRITE_COILS 0x0F //COIL
2661 #define MODBUS_WRITE_REGISTERS 0x10 //HOLDING REGISTER
2662 
2663 
2668 //MAP TYPE
2669 #define MODBUS_COIL 0x01
2670 #define MODBUS_INPUT_COIL 0x02
2671 #define MODBUS_HOLDING_REGISTER 0x03
2672 #define MODBUS_INPUT_REGISTER 0x04
2673 
2674 
2675 typedef enum
2676 {
2706 
2708 {
2709  UINT8 accepted_connections; // example: 5 -> five connections right now
2710  char ip[MODBUS_MAX_CONNECTION][17]; // example: ip[4] -> 192.168.127.254. ip[5] ~ ip[9] are invalid.
2711  UINT16 port[MODBUS_MAX_CONNECTION]; // example: port[4] -> 12345. port[5] ~ port[9] are invalid.
2712 } __attribute__((packed));
2719 
2725 
2733 MODBUS_SLAVE_ERR_CODE MX_RTU_Modbus_Tcp_Slave_Register(UINT16 port, UINT16 map_size, UINT32 idle_timeout_second, UINT32 *sHandle);
2734 
2740 
2748 
2756 
2768 MODBUS_SLAVE_ERR_CODE MX_RTU_Modbus_Tcp_Slave_Add_Entry(UINT32 sHandle, UINT8 map_type, UINT16 address, void *pUserData, pfnModbusRead, pfnModbusWrite); //MAP TYPE
2769 
2776 MODBUS_SLAVE_ERR_CODE MX_RTU_Modbus_Tcp_Slave_Delete_Entry(UINT32 sHandle, UINT8 map_type, UINT16 address); //MAP TYPE
2777 
2783 MODBUS_SLAVE_ERR_CODE MX_RTU_Modbus_Tcp_Slave_Map_Count(UINT32 sHandle, UINT16 *count);
2784 
2790 
2798 /*********************************************************************************************/
2799 
2800 /*********************************************AOPC*********************************************/
2812 #define AOPC_DEFAULT_PORT 9900
2813 
2814 
2815 #define AOPC_MAX_DEV_NAME 59
2816 #define AOPC_MAX_TAG_NAME 30
2817 #define AOPC_MAX_TAG_DESC 16
2818 #define AOPC_MAX_TAG_UNIT 16
2819 
2824 //AOPC tag value type
2825 #define TAG_TYPE_BOOL 1
2826 #define TAG_TYPE_WORD 2
2827 #define TAG_TYPE_INT 3
2828 #define TAG_TYPE_DWORD 4
2829 #define TAG_TYPE_FLOAT 5
2830 #define TAG_TYPE_STRING 6
2831 #define TAG_TYPE_SHORT 7
2832 
2833 
2838 //AOPC tag access right
2839 #define TAG_ACC_READ 0 //read only
2840 //#define TAG_ACC_WRITE 1 //write only
2841 #define TAG_ACC_READ_WRITE 2 //read/writable
2842 
2843 
2848 //AOPC tag quality
2849 #define TAG_QUALITY_GOOD 0x0000
2850 #define TAG_QUALITY_BAD 0x8000
2851 
2852 
2853 typedef struct TagInfo
2854 {
2858  UINT8 tagAccessRight; //0:read only, 1:write only, 2:read/writable
2860  UINT16 tagQuality; //(0x0000-0x7FFF:Good, 0x8000-0xFFFF:Bad)
2861  void *tagValue;
2862  UINT8 (*tagCallBack)(UINT8 *tagName, UINT16 tagValueType, UINT8 *tagValue);
2863 }TAG;
2864 
2865 typedef enum
2866 {
2867  AOPC_ERR_OK = 0, //successfully
2868  AOPC_ERR_LIB_INIT, //please call MX_RTU_AOPC_Init() first
2869  AOPC_ERR_PARAM, //invalid parameters
2870  AOPC_ERR_SOCKET, //network error
2871  AOPC_ERR_TIMEOUT, //timeout
2872  AOPC_ERR_CONNECT, //connect to AOPC server error
2873  AOPC_ERR_CREATE_THREAD, //create thread error
2874  AOPC_ERR_NO_MEMORY, //alloc memory error
2875  AOPC_ERR_NO_QUEUE, //queue lenght reaches maximum limitation: 65536 items
2876  AOPC_ERR_INTR, //interrupt by signal
2877  AOPC_ERR_FRAME_PENDING, //waiting for a complete frame data
2878  AOPC_ERR_FRAME_ERROR, //frame data format error
2879  AOPC_ERR_SERVER_ERROR, //this is a temp error for API developments
2880  AOPC_ERR_CLOSE, //connection is closed
2881  AOPC_ERR_NO_TAG, //no such tag
2882  AOPC_ERR_EXIST_TAG, //tag exists
2883  AOPC_ERR_NO_WRITE_FUNC, //user does not register a write-callback for this tag
2884  AOPC_ERR_ACCESS, //no write access right
2885  AOPC_ERR_USER_WRITE, //user's wirte callback returns error condition
2886  AOPC_ERR_NOT_SUPPORT, //the function is not supported
2887  AOPC_ERR_NOT_WRITABLE, //the tag is marked writable but the write-callback function is not assigned
2888  AOPC_ERR_FAIL, //generic error
2889  AOPC_ERR_NOT_REGISTERED, //device is not registered yet
2890  AOPC_ERR_INVALID_ATTR, //invalid tag attribute
2891  AOPC_ERR_SYSTEM_INFO, //can't get system info
2892  AOPC_ERR_STR_LEN, //string length exceed 255 bytes
2894 } AOPC_ERR_CODE;
2895 
2901 
2905 void MX_RTU_AOPC_Uninit(void);
2906 
2916 AOPC_ERR_CODE MX_RTU_AOPC_Connect(UINT8 *deviceName, UINT32 heartBeatS, UINT8 *ipAddress, UINT16 port, UINT32 timeoutMs, UINT32 *sHandle);
2917 
2922 AOPC_ERR_CODE MX_RTU_AOPC_Disconnect(UINT32 sHandle);
2923 
2929 AOPC_ERR_CODE MX_RTU_AOPC_Reconnect(UINT32 sHandle, UINT32 timeoutMs);
2930 
2938 AOPC_ERR_CODE MX_RTU_AOPC_AddTag(UINT32 sHandle, TAG *tagInfo, struct Timestamp *tagTime, UINT32 timeoutMs);
2939 
2946 AOPC_ERR_CODE MX_RTU_AOPC_DelTag(UINT32 sHandle, UINT8 *tagName, UINT32 timeoutMs);
2947 
2953 AOPC_ERR_CODE MX_RTU_AOPC_DelAllTag(UINT32 sHandle, UINT32 timeoutMs);
2954 
2962 AOPC_ERR_CODE MX_RTU_AOPC_UpdateTag(UINT32 sHandle, TAG *tagInfo, struct Timestamp *tagTime, UINT32 timeoutMs);
2963 
2972 AOPC_ERR_CODE MX_RTU_AOPC_UpdateValue(UINT32 sHandle, UINT8 *tagName, void *tagValue, struct Timestamp *tagTime, UINT32 timeoutMs);
2973 
2980 AOPC_ERR_CODE MX_RTU_AOPC_UpdateHeartbeat(UINT32 sHandle, UINT32 heartbeatS, UINT32 timeoutMs);
2982 /*********************************************************************************************/
2983 
2984 /*********************************************TAG*********************************************/
2999 #define TAG_MAX_NAME_SIZE 64
3000 
3005 #define TAG_DATA_TYPE_COIL 0
3006 #define TAG_DATA_TYPE_INT8 1
3007 #define TAG_DATA_TYPE_INT16 2
3008 #define TAG_DATA_TYPE_INT32 3
3009 #define TAG_DATA_TYPE_UINT8 4
3010 #define TAG_DATA_TYPE_UINT16 5
3011 #define TAG_DATA_TYPE_UINT32 6
3012 #define TAG_DATA_TYPE_FLOAT 7
3013 #define TAG_DATA_TYPE_STR 8
3014 
3015 
3020 #define TAG_EVENT_CONDITION_CHANGE 0
3021 #define TAG_EVENT_CONDITION_EDGE 1
3022 #define TAG_EVENT_CONDITION_RAISING_EDGE 2
3023 #define TAG_EVENT_CONDITION_FALLING_EDGE 3
3024 #define TAG_EVENT_CONDITION_GREATER 4
3025 #define TAG_EVENT_CONDITION_SMALLER 5
3026 
3027 
3028 typedef enum
3029 {
3030  TAG_ERR_OK = 0, //successfully
3031  TAG_ERR_INIT, // Tag init error
3033  TAG_ERR_MSGQUEUE, // message queue access err
3035  TAG_ERR_PARAM, // invalid parameters
3038  TAG_ERR_BIND, // bind resource
3041  TAG_ERR_IO, // access IO err
3042  TAG_ERR_READY, // Tag framework has been init
3044  TAG_ERR_MSGQUEUE_FULL, // message queue full
3045  TAG_ERR_NOT_SUPPORT, // this usage is not supported
3046  TAG_ERR_EVENT_INIT, // Tag event init error
3047  TAG_ERR_EVENT_REGISTER, // Tag event register error
3048  TAG_ERR_EVENT_SPACE, // Too many events
3049  TAG_ERR_EVENT_HANDLE, // No such event
3050  TAG_ERR_EVENT_EMPTY, // No event occurred
3052 } TAG_ERR_CODE;
3053 
3054 //Service and Profile status
3055 typedef enum
3056 {
3063 } STATUS_CODE;
3064 
3065 typedef struct TAG_INFO_T
3066 {
3069  UINT32 tagId;
3070  UINT32 tagSize;
3071  UINT32 dataType;
3072 } TAG_INFO;
3073 
3075 {
3076  UINT32 condition;
3077  float threshold;
3078  float hysteresis;
3080 
3086 
3092 
3098 
3104 TAG_ERR_CODE MX_RTU_Tag_Get_Info(UINT8 *tagName, TAG_INFO *info);
3105 
3116 TAG_ERR_CODE MX_RTU_Tag_Read(UINT8 *tagName, void *tagValue, UINT32 tagSize, UINT32 *readBytes, struct Timestamp *time);
3117 
3124 TAG_ERR_CODE MX_RTU_Tag_Write(UINT8 *tagName, void *tagValue, UINT32 tagSize);
3125 
3132 TAG_ERR_CODE MX_RTU_Tag_Event_Register(UINT8 *tagName, TAG_EVENT_CONDITION *condition, int *handle);
3133 
3139 
3149 TAG_ERR_CODE MX_RTU_Tag_Event_Get(int handle, void *tagValue, struct Timestamp *time);
3150 
3158 
3160 /*********************************************************************************************/
3161 
3163 
3164 #ifdef __cplusplus
3165 }//extern "C"
3166 #endif
3167 
3168 #endif
3169