#include #include #include #include #include "..\Lib\8000a.h" #include "..\Lib\MBRTU.h" #include "..\lib\io_scan.h" #include "showled.h" #include "smmi_com.h" unsigned char iMemory_DI[1000]; unsigned char iMemory_DO[1000]; int iMemory_AI[1200]; int iMemory_AO[1200]; int main(void) { int iRet; int iScanCOMPort=1; int iShowCOMPort=1; int i; int iSMMI_Status=0; InitLib(); EnableWDT(); for(i=0;i<1200;i++) iMemory_AO[i]=0; for(i=0;i<1000;i++) iMemory_DO[i]=0; iRet=InitModbus(iMemory_DI,iMemory_DO,iMemory_AI,iMemory_AO); Init_IO_Scan(iMemory_DI,iMemory_DO,iMemory_AI,iMemory_AO); iMemory_AI[1000]=8000; for(;;) { i=UpdateIOModule(); // ******** Begin of the Modbus Kernel ******* if(mtModbusPort[iScanCOMPort].EnableMode==_ModbusRTU_Slave) CheckModbusRTURequest(iScanCOMPort); // Is any request from Modbus/RTU Master ? if(mtModbusPort[iScanCOMPort].EnableMode==_ModbusASCII_Slave) CheckModbusASCIIRequest(iScanCOMPort); // Is any request from Modbus/ASCII Master ? iScanCOMPort++; if(iScanCOMPort>iTotalCOMPort) iScanCOMPort=1; if(iSMMI_Status==0) iShowCOMPort=ShowLED(iShowCOMPort); if(iShowCOMPort>iTotalCOMPort) iShowCOMPort=1; iSMMI_Status=SMMI_Com_CheckIn(); // ******** End of the Modbus Kernel ******* RefreshWDT(); } } void Modbus_Request_Event(char* CommandData,int* CommandLength) { /* Modbus_Request_Event is supported since version 1.6.8 [2007,03,13]. char* CommandData: For Modbus/TCP, it includes 6 leading bytes. (needful) For Modbus/RTU, it includes 6 leading bytes. (needless) int* CommandLength: For Modbus/TCP, it includes 6 leading bytes. For Modbus/RTU, it includes 6 leading bytes. */ /* Example code */ //int i; //printCom1("FC:%2d StartAddress:%3d IOCount:%4d\n\r",iModbusRequest_Fun, iModbusRequest_Addr,iModbusRequest_IOCount); //printCom1("Modbus Request\n\r In==>"); //for(i=0;i<*CommandLength;i++) // printCom1("[%02X] ",CommandData[i]&0xFF); } void Modbus_Response_Event(char* ResponseData,int* ResponseLength) { /* char* ResponseData: For Modbus/TCP, it includes 6 leading bytes. For Modbus/RTU, it doesn't include 6 leading bytes int* CommandLength: For Modbus/TCP, it includes 6 leading bytes. For Modbus/RTU, it doesn't include 6 leading bytes */ //If you want to change the content of the ResponseData, //you have to do 2 steps for Modbus/TCP or Modbus/RTU. //Step1: Change content (Note:you must know the modbus protocol well) //ResponseData[6]=0x19; //ResponseData[7]=0x75; //ResponseData[8]=0x04; //ResponseData[9]=0x01; //Step2: Update data length //*ResponseLength=10; //int i; //printCom1("\n\r Out==>"); //for(i=0;i<*ResponseLength;i++) // printCom1("[%02X] ",ResponseData[i]&0xFF); //printCom1("\n\r"); //MRTU Comfiguration if((iMemory_AO[1000]!=0)&&(iMemory_AO[1001]!=0)) ConfigByRegister(); }