CHE-WEI LIN
/
modbus_test
share
main.cpp
- Committer:
- ohlaaa
- Date:
- 2020-03-23
- Revision:
- 2:9497b91d341a
- Parent:
- 1:17ea42de4a8a
File content as of revision 2:9497b91d341a:
#include "mbed.h" #include "ATParser.h" #include "string.h" #include <string> Serial pc(USBTX, USBRX); //((USBTX, USBRX)) Serial modbus(PA_9, PA_10,9600);//(tx,rx,baud) //Serial evk(PC_10,PC_11,115200); //CN7 BufferedSerial evk(PC_10,PC_11,1024); ATParser at=ATParser(evk,"\r\n"); DigitalOut DE_RE(PA_8); int Max_Byte=8; uint8_t mdb_Command_buffer[11]; uint8_t mdb_Message_buffer[8]; uint16_t RTU_CRC; int message_in_byte=0; char device_counter=1; int D3_X0 = 0; int D1_X0 = 0; char server_buff[27]={0}; void AT_publish(char* s); struct mdb_Data_Set { uint8_t Addr; uint8_t Data[8]; }; mdb_Data_Set mdb_Data[8]; //MODBUS RTU CRC uint16_t mdbRTU_CRC(uint8_t message[], int Length) { RTU_CRC=0xffff; for (int pos =0 ; pos < Length ; pos++) { RTU_CRC ^= (uint16_t)message[pos]; for (int i = 8; i != 0; i--) { if ((RTU_CRC & 0x0001) != 0) { RTU_CRC >>= 1; RTU_CRC ^= 0xA001; } else RTU_CRC >>= 1; } } return RTU_CRC; //pc.printf("hi_mdb_CRC= %02X \r\n", hi_RTU_CRC); //pc.printf("lo_mdb_CRC= %02X \r\n", lo_RTU_CRC); } //char to int int char_to_int(char high,char low){ int H = high - 48; int L = low - 48; int K = H*10 + L -30; if(K == 31) return 10; else if(K == 32) return 11; else if(K == 33) return 12; else if(K == 34) return 13; else if(K == 35) return 14; else if(K == 36) return 15; else return K; } //write modbus_data void mdb_control(uint8_t action){ int dev_Addr = 0; int command_length=0; uint8_t hi_RTU_CRC ; uint8_t lo_RTU_CRC ; switch(action){ case 1: dev_Addr = 1; pc.printf("Device 1 task 1 : Read X0~X7 \n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x01; mdb_Command_buffer[1]=(uint8_t) 0x02; mdb_Command_buffer[2]=(uint8_t) 0x04; mdb_Command_buffer[3]=(uint8_t) 0x10; mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x08; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 2: dev_Addr = 1; pc.printf("Device 1 task2 : Y3 change state every 5 seconds \n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x01; mdb_Command_buffer[1]=(uint8_t) 0x01; mdb_Command_buffer[2]=(uint8_t) 0x05; mdb_Command_buffer[3]=(uint8_t) 0x03; mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x01; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 3: dev_Addr = 1; pc.printf("Device 1 task 3 : Read D0 which add 1 per second \n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x01; mdb_Command_buffer[1]=(uint8_t) 0x03; mdb_Command_buffer[2]=(uint8_t) 0x10; mdb_Command_buffer[3]=(uint8_t) 0x00; mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x01; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 4: dev_Addr = 1; if(D1_X0==0)pc.printf("Device 1 task 4 : Set X0 ON\n"); else pc.printf("Device 1 task 4 : Set X0 OFF\n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x01; mdb_Command_buffer[1]=(uint8_t) 0x05; mdb_Command_buffer[2]=(uint8_t) 0x05; mdb_Command_buffer[3]=(uint8_t) 0x00; if(D1_X0==0)mdb_Command_buffer[4]=(uint8_t) 0xFF; else mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x00; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 5: dev_Addr = 1; pc.printf("Device 1 task 4 : Read Y0 \n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x01; mdb_Command_buffer[1]=(uint8_t) 0x02; mdb_Command_buffer[2]=(uint8_t) 0x04; mdb_Command_buffer[3]=(uint8_t) 0x00; mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x08; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 6: dev_Addr = 2; pc.printf("Device 2 : Voltage \n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x02; mdb_Command_buffer[1]=(uint8_t) 0x03; mdb_Command_buffer[2]=(uint8_t) 0x01; mdb_Command_buffer[3]=(uint8_t) 0x06; mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x02; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 7: dev_Addr = 3; if(D3_X0==0)pc.printf("Device 3 : Set X0 ON\n"); else pc.printf("Device 3 : Set X0 OFF\n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x03; mdb_Command_buffer[1]=(uint8_t) 0x05; mdb_Command_buffer[2]=(uint8_t) 0x05; mdb_Command_buffer[3]=(uint8_t) 0x00; if(D3_X0==0)mdb_Command_buffer[4]=(uint8_t) 0xFF; else mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x00; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 8: dev_Addr = 3; pc.printf("Device 3 : Read Y0 \n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x03; mdb_Command_buffer[1]=(uint8_t) 0x02; mdb_Command_buffer[2]=(uint8_t) 0x04; mdb_Command_buffer[3]=(uint8_t) 0x00; mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x08; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; case 9: dev_Addr = 5; pc.printf("Device 5 : Read Temperature \n"); command_length = 8; //pc.printf("\nRead from device %d at %04x with length %04x\n",dev_Addr,Hold_Reg,Reg_len); mdb_Command_buffer[0]=(uint8_t) 0x05; mdb_Command_buffer[1]=(uint8_t) 0x03; mdb_Command_buffer[2]=(uint8_t) 0x10; mdb_Command_buffer[3]=(uint8_t) 0x00; mdb_Command_buffer[4]=(uint8_t) 0x00; mdb_Command_buffer[5]=(uint8_t) 0x01; RTU_CRC=mdbRTU_CRC(mdb_Command_buffer,6); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); mdb_Command_buffer[6]=lo_RTU_CRC; mdb_Command_buffer[7]=hi_RTU_CRC; break; default: command_length = 0; pc.printf("there is no action in mdb_ctrol"); break; } // put command_buffer to modbus DE_RE=1; int byte_of_buffer; for (byte_of_buffer=0 ; byte_of_buffer<command_length ; byte_of_buffer++) { modbus.putc(mdb_Command_buffer[byte_of_buffer]); } wait_ms(2); message_in_byte=0; DE_RE =0 ; wait_ms(80); int data_len=(int)(mdb_Message_buffer[2]); RTU_CRC=mdbRTU_CRC(mdb_Message_buffer,data_len+3); hi_RTU_CRC = (uint8_t)((RTU_CRC & 0xFF00) >> 8); lo_RTU_CRC = (uint8_t)(RTU_CRC & 0x00FF); if ((mdb_Message_buffer[data_len+3]==lo_RTU_CRC)&&(mdb_Message_buffer[data_len+4]==hi_RTU_CRC)) { for (int i=0 ; i<data_len ; i++) { mdb_Data[(dev_Addr)].Data[i]=mdb_Message_buffer[i+3]; pc.printf("mdb_Data= %02x\r\n",mdb_Data[(dev_Addr)].Data[i]); char _buff[13]; sprintf((char*)_buff,"mdb_Data= %02x",mdb_Data[(dev_Addr)].Data[i]); char buff[4]; sprintf((char*)buff,"%d,%02x",dev_Addr,mdb_Data[(dev_Addr)].Data[i]); } } } //put PC input into modbus void PC_callback() { //modbus.putc(pc.getc()); // char incomming_CMD; /* while (pc.readable()){ incomming_CMD+=pc.getc()-1; } pc.printf("Received Command :%c\r\n", incomming_CMD);*/ // evk.putc(pc.getc()); /* if(pc.readable()){ ch=pc.getc(); at_cmd[index++]=ch; } at_cmd[index]='\x0'; pc.printf(at_cmd);*/ if(pc.readable()){ char at_cmd[100]; int index=0; char ch; do{ ch=pc.getc(); at_cmd[index++]=ch; pc.printf(at_cmd); }while(ch!='\n'); at_cmd[index]='\x0'; pc.printf(at_cmd); AT_publish(at_cmd); //pc.putc(pc.getc()); } } void evk_callback() { /* int counter=0; char ch; char evk_buff[300]; while(evk.readable()){ ch=at.getc(); evk_buff[counter]=ch; counter++; } evk_buff[counter]='\x0'; if(strncmp(evk_buff,"AT+UUSORD",9)==1){ } else pc.printf(evk_buff); */ //pc.putc(evk.getc()); //int callback_len=0; //if(at.recv("AT+USORD=0,%d",&callback_len))pc.printf(&callback_len); } //put modbus reply into PC void MODBUS_callback() { //pc.putc(modbus.getc()); mdb_Message_buffer[message_in_byte]=modbus.getc(); message_in_byte++; } void AT_publish(char* s){ if(at.send("AT+UMQTTC=2,0,0,\"nbiot/gw\",\"%s\"",s) )pc.printf("Send \"%s\" to MQTT server\r\n",s); else pc.printf("Send \"%s\" to Server Failed !\r\n",s); at.flush(); wait_ms(10); } int main() { pc.baud(115200); evk.baud(115200); at.setTimeout(6000); //evk.attach(&evk_callback); pc.attach(&PC_callback); modbus.attach(&MODBUS_callback); server_buff[2]=';'; server_buff[4]=';'; server_buff[11]=';'; server_buff[13]=';'; server_buff[20]=';'; server_buff[22]=';'; //=========TEST AT============= if(at.send("AT")&& at.recv("AT")&&at.recv("OK")){ pc.printf("AT OK\n"); // evk.printf("AT OK"); } else pc.printf("AT NO OK\n"); wait_ms(3000); //========SET MQTT IP============ if(at.send("AT+UMQTT=3,\"140.114.78.141\"") && at.recv("AT+UMQTT=3,\"140.114.78.141\"") && at.recv("+UMQTT: 3,1") && at.recv("OK")) pc.printf("Set IP OK\n"); else pc.printf("IP NO OK\n"); //========CONNECT TO MQTT SERVER======= if(at.send("AT+UMQTTC=1") && at.recv("AT+UMQTTC=1") && at.recv("+UMQTTC: 1,1") && at.recv("OK") && at.recv("+UUMQTTC: 1,0"))pc.printf("Connected to MQTT Server\n"); else pc.printf("Connect to Server failed !\n"); //========SEND MESSAGE ============= if(at.send("AT+UMQTTC=2,0,0,\"nbiot/gw\",\"HELLO Send From F466RE,466924700006098\"") && at.recv("AT+UMQTTC=2,0,0,\"nbiot/gw\",\"HELLO Send From F466RE,466924700006098\"") && at.recv("+UMQTTC: 2,1") && at.recv("OK"))pc.printf("Send Hello to MQTT Server\r\n"); else pc.printf("Send Message to Server Failed !\n"); while(1) { for(int i=1;i<10;i++){ mdb_control(i); if(i==1){ char buff[2]; sprintf((char*)buff,"%02x",mdb_Data[1].Data[0]); pc.printf("%02x\r\n",mdb_Data[1].Data[0]); server_buff[0]=buff[0]; server_buff[1]=buff[1]; } if(i==2){ if(mdb_Data[1].Data[0]==0x02){ server_buff[3]='0'; pc.printf("Y3 OFF\r\n"); } else { server_buff[3]='1'; pc.printf("Y3 ON\r\n"); } } else if(i==3){ uint16_t data = ((((uint16_t)(mdb_Data[1].Data[0]))<<8) | (uint16_t)(mdb_Data[1].Data[1])); pc.printf("counter = %04X(hex) , %d(int)\r\n\n",data,data); char buff[6]; sprintf((char*)buff,"%6d",data); server_buff[5]=buff[0]; server_buff[6]=buff[1]; server_buff[7]=buff[2]; server_buff[8]=buff[3]; server_buff[9]=buff[4]; server_buff[10]=buff[5]; } else if(i==5){ if(mdb_Data[1].Data[0]==0x00){ server_buff[12]='0'; pc.printf("D1_Y0 OFF\r\n"); } else { server_buff[12]='1'; pc.printf("D1_Y0 ON\r\n"); } } else if(i==6){ int voltage = (((uint32_t)(mdb_Data[2].Data[0]))<< 8) | (((uint32_t)(mdb_Data[2].Data[1]))) | (((uint32_t)(mdb_Data[2].Data[2]))<< 24) | (((uint32_t)(mdb_Data[2].Data[3]))<< 16); float *pf=(float*)&voltage; //printf("%f",*pf); pc.printf("voltage = %08x(hex) %.2f(float)\r\n",voltage,*pf); int a = *pf*100; pc.printf("a = %d\r\n",a); char buff[5]; sprintf(buff,"%5d",a); pc.printf("buff = %02x%02x%02x%02x%02x\r\n",buff[0],buff[1],buff[2],buff[3],buff[4]); server_buff[14]=buff[0]; server_buff[15]=buff[1]; server_buff[16]=buff[2]; server_buff[17]='.'; server_buff[18]=buff[3]; server_buff[19]=buff[4]; } if(i==8){ if(mdb_Data[3].Data[0]==0x00){ server_buff[21]='0'; pc.printf("D3 Y0 OFF\r\n"); } else { server_buff[21]='1'; pc.printf("D3 Y0 ON\r\n"); } } else if(i==9){ uint16_t temperature = ((((uint16_t)(mdb_Data[5].Data[0]))<<8) | (uint16_t)(mdb_Data[5].Data[1])); pc.printf("temperature = %04x(hex),%d(int)\r\n",temperature,temperature); char buff[3]; sprintf(buff,"%3d",temperature); server_buff[23]=buff[0]; server_buff[24]=buff[1]; server_buff[25]='.'; server_buff[26]=buff[2]; AT_publish(server_buff); } pc.printf("============\r\n"); wait_ms(50); } } }