/* Compiler: BC++ 3.1, TC++ 3.0, TC++ 1.01 Compile mode: large Project: main.c ..\lib\upac5000.lib ..\lib\tcp_dm32.lib ..\lib\FW_09314.lib ..\lib\MBT7@174.lib Hardware: uPAC-5000 series Modbus demo for uPAC-5000 series The uPAC-5000 acts as a Modbus RTU, ASCII and TCP slave. [Feb 09, 2015] Beta Version */ #include #include #include #include #include #include "..\lib\upac5000.h" #include "..\lib\Tcpip32.h" #include "..\lib\MFW.h" #include "..\lib\MBTCP_XS.h" #define MODBUS_REGISTER_SIZE 1024 void UPort502(int skt, int mode); TCP_SERVER MBTcp={ 502, /* port */ -1, /* socket */ 0, /* state */ 0, /* connect */ UPort502 /* CallBackFun */ }; /* The I/O memory mapping */ unsigned char far iMemory_DI[MODBUS_REGISTER_SIZE]; unsigned char far iMemory_DO[MODBUS_REGISTER_SIZE]; int far iMemory_AI[MODBUS_REGISTER_SIZE]; int far iMemory_AO[MODBUS_REGISTER_SIZE]; #define COMPORT_NUMBER 2 int GetComportNumber(void) { return COMPORT_NUMBER; } void XS_UserInit(int argc, char *argv[]) { extern long MacTimeout; extern long MacRxTimeout; extern int bAcceptBroadcast; extern unsigned long ACKDELAY; /* vaariable in tcp.c */ extern long MAXTXTOUT; void UserLoop(void); int i, iRet; InitLib(); ACKDELAY=200; MAXTXTOUT=6000UL; bAcceptBroadcast=0; XS_AddSystemLoopFun(UserLoop); /* ======= Begin of Modbus Kernel ======= */ XS_AddServer(&MBTcp); /* Add Modbus/TCP server */ ComData[1-1].baud=115200l; ComData[1-1].databit=8; ComData[1-1].parity=0; ComData[1-1].stopbit=1; VcomSaveComData(1-1); ComData[2-1].baud=9600l; ComData[2-1].databit=8; ComData[2-1].parity=0; ComData[2-1].stopbit=1; VcomSaveComData(2-1); Set_COMEnableMode(1, _ModbusRTU_Slave); // set the COM1/RS232 to be a Modbus/RTU slave port Set_COMEnableMode(2, _ModbusASCII_Slave); // set the COM2/RS485 to be a Modbus/ASCII slave port Set_NetID(1); /* set the Modbus ID to 01 */ iRet=InitModbus(iMemory_DI, iMemory_DO, iMemory_AI, iMemory_AO); if(iRet!=NoError) { StopModbus(); } Modbus_Memory_Size(MODBUS_REGISTER_SIZE, MODBUS_REGISTER_SIZE, MODBUS_REGISTER_SIZE, MODBUS_REGISTER_SIZE); _fmemset(iMemory_DI, 0x0, MODBUS_REGISTER_SIZE); _fmemset(iMemory_DO, 0x0, MODBUS_REGISTER_SIZE); _fmemset(iMemory_AI, 0x0, sizeof(int) * MODBUS_REGISTER_SIZE); _fmemset(iMemory_AO, 0x0, sizeof(int) * MODBUS_REGISTER_SIZE); /* ======= End of Modbus Kernel ======= */ XS_AddSystemLoopFun(XS_SocketLoopFun); XS_StartSocket(); MacTimeout=30000L; MacRxTimeout=160000L; EnableWDT(); } void XS_UserEnd(void) { XS_StopSocket(); RestoreCom(1); RestoreCom(2); StopModbus(); DisableWDT(); } void UserLoop(void) { RefreshWDT(); ModbusLoopFun(); iMemory_DI[0]=0; // iMemory_DI[] is corresponding to the Modbus registers, 1xxxxx iMemory_DI[1]=1; iMemory_DO[0]=1; // iMemory_DO[] is corresponding to the Modbus registers, Oxxxxx iMemory_DO[1]=0; iMemory_AI[0]=0x1234; // iMemory_AI[] is corresponding to the Modbus registers, 3xxxxx iMemory_AO[0]=0x4567; // iMemory_AO[] is corresponding to the Modbus registers, 4xxxxx } void UPort502(int skt, int mode) { TCPREADDATA pTCP_Data_Pointer; static char recBuf[512]; int iRet; if(!mode) { SOCKET_SET_TCP_KEEP_ALIVE_ON(skt); } else { if((iRet=XS_ReadSocket(skt, recBuf, sizeof(recBuf)))<=0) { SOCKET_SET_TCP_KEEP_ALIVE_OFF(skt); XS_CloseSocket(skt); return; } pTCP_Data_Pointer.Socket=skt; pTCP_Data_Pointer.ReadUartChar=recBuf; pTCP_Data_Pointer.Length=iRet; VcomCmdModbus(&pTCP_Data_Pointer); RefreshWDT(); } } void Modbus_Request_Event(char* CommandData, int* CommandLength) { CommandData=CommandData; CommandLength=CommandLength; } void Modbus_Response_Event(char* ResponseData, int* ResponseLength) { ResponseData=ResponseData; ResponseLength=ResponseLength; } void main(int argc, char *argv[]) { XS_main(argc, argv); // call the XS library main function }