const int MC9_CH[] = {1000, 1008, 1016, 1024, 1100, 1108, 1116, 1124}; // 10DWR,02,0302,0001,0501,0001 // Auto Tune. 0302(Ch Sel) 0001(Ch.1) 0501(AT) 0001(On, Off=0000) void setupMC9_1(int i, int data){ RS485_1_Addr[i] = data; Serial.println("MC9 No."+ String(i) + " 's address set as " + String(data)); } String msg_MC9_PV(int addr){ String message = ""; if(addr < 10){ message += "0"; } message += String(addr); // Address message += "DRS,08,0001"; // Data Read Seris 08 data from 0001(PV) ch message += sumMC9(message); // Check Sum message = "" + message; // Start with STX return message; } String msg_MC9_SV(int addr){ String message = ""; if(addr < 10){ message += "0"; } message += String(addr); // Address message += "DRS,08,0011"; // Data Read Seris 08 data from 0001(SV) ch message += sumMC9(message); // Check Sum message = "" + message; // Start with STX return message; } int msg_MC9_SV_set(unsigned int data[], int dataSize){ String message = ""; int lp0, lp1; if(dataSize > 8){ lp0 = 8; lp1 = dataSize; }else{ lp0 = dataSize; lp1 = 0; } if(RS485_1_Addr[0] != 0){ if(RS485_1_Addr[0] < 10){ message += "0"; } message = String(RS485_1_Addr[0]); message += "DWR,0" + String(lp0) + ","; for(int i=0 ; i0)){ if(RS485_1_Addr[1] < 10){ message += "0"; } message = String(RS485_1_Addr[1]); message += "DWR,0" + String(lp1-8) + ","; for(int i=8 ; i0)){ if(RS485_1_Addr[1] < 10){ message += "0"; } message += String(RS485_1_Addr[1]); message += "DWR,16,"; for(int i=0 ; i<8 ; i++){ String atFlag; if(at[i+8]){ atFlag = "0001"; }else{ atFlag = "0000"; } message += "0302,"; // Ch No cmd. message += "000" + String(i+1) + ","; // Ch No. message += "0501,"; // AT cmd. message += atFlag; // AT flag if(i != 7){ message += ","; } } message += sumMC9(message); message = "" + message + CRLF; write_buff_first(Buff_485_1_Wr, message); } return 0; } int saveMC9(String message){ int addr; int idx = -1; String mode; int data[8]; int crc; if (!parseMC9(message, addr, mode, data, crc)) { for(int i=0 ; i < 2 ; i++){ // RS485_1 has two rooms for two MC9s if(RS485_1_Addr[i] == addr){ idx = i; break; } } if(idx < 0){ return -1; } if(latest_sent_msg.indexOf("DRS,08,0001") != -1){ // if sent message is PV CMD //rcv_10_PV = true; RS485_1_Rcv_PV[idx] = true; for(int i = 0 ; i < RS485_1_Rcv_size ; i++){ RS485_1_Values_PV[i + idx*8] = data[i]; } } if(latest_sent_msg.indexOf("DRS,08,0011") != -1){ // if sent message is SV CMD //rcv_10_SV = true; RS485_1_Rcv_SV[idx] = true; for(int i = 0 ; i < RS485_1_Rcv_size ; i++){ RS485_1_Values_SV[i + idx*8] = data[i]; } } return 0; } else { Serial.println("error 485 read"); return -1; } } int timeoutMC9(){ int addr; int idx = -1; String msg, mode, cmd; char dummy[4]; int data[8]; int crc; // Message parsing msg = latest_sent_msg.substring(1); sscanf(msg.c_str(), "%2d%3s", &addr, &dummy); Serial.print("485 not responced... (Timeout) Req msg : " + latest_sent_msg); if (latest_sent_msg.indexOf("DRS") != -1) { for(int i=0 ; i < 2 ; i++){ // RS485_1 has two rooms for two MC9s // Find idx of array if(RS485_1_Addr[i] == addr){ idx = i; break; } } // If not matched, return error if(idx < 0){ Serial.println(); return -1; } if(latest_sent_msg.indexOf("DRS,08,0001") != -1){ // if sent message is PV CMD RS485_1_Rcv_PV[idx] = false; Serial.print(" >> PV @"); Serial.println(idx); } if(latest_sent_msg.indexOf("DRS,08,0011") != -1){ // if sent message is SV CMD RS485_1_Rcv_SV[idx] = false; Serial.print(" >> SV @"); Serial.println(idx); } return 0; } else { Serial.println(); return -1; } /* if(latest_sent_msg == MC9_10_PV){ //rcv_10_PV = false; } if(latest_sent_msg == MC9_10_SV){ //rcv_10_SV = false; }else { Serial.println("error 485 read"); return -1; } */ } int parseMC9(const String& message, int& addr, String& mode, int data[8], int& crc) { char addrC[3], modeC[4], statusC[3]; int dataC[8], crcC; // Remove start-of-text character if present if (message[0] == '\x02') { message = message.substring(1); } // Parse the MC9 message int ret = sscanf(message.c_str(), "%2s%3s,%2s,%4x,%4x,%4x,%4x,%4x,%4x,%4x,%4x%2x", addrC, modeC, statusC, &dataC[0], &dataC[1], &dataC[2], &dataC[3], &dataC[4], &dataC[5], &dataC[6], &dataC[7], &crcC); // Check the parsed status and the number of extracted elements if (strcmp(statusC, "OK") != 0 || ret != 12) { return -1; } // Copy data to the output parameters addr = atoi(addrC); mode = String(modeC); for (int i = 0; i < 8; i++) { data[i] = dataC[i]; } crc = crcC; return 0; } String sumMC9(String input) { int sum = 0; for (char c : input) { sum += c; } sum = sum & 0xFF; // Make sure we only keep the least significant byte String hexSum = String(sum, HEX); // Convert the sum to hexadecimal hexSum.toUpperCase(); // Make it upper-case return hexSum; }