c++ 通过网络模块Socket连接三菱PLC
一、头文件
//--------------------------------------- #pragma hdrstop #include "PLCEthernet.h" //--------------------------------------- #pragma package(smart_init) #include <math.h> TPLCEthernet *pPLCEthernet; //--------------------------------------- __fastcall TPLCEthernet::TPLCEthernet(int pctoplc[], int plctopc[], int Address) { issendcommand = false; BaseAddress = Address; arrayindex1 = 0; array1 = pctoplc; array2 = plctopc; returnvalue = 0; } //--------------------------------------- __fastcall TPLCEthernet::~TPLCEthernet(void) { } //--------------------------------------- // decimal to hexadecimal char __fastcall TPLCEthernet::hexadecimal(int value) { char hex_value; switch (value) { case 1: hex_value = '1'; break; case 2: hex_value = '2'; break; case 3: hex_value = '3'; break; case 4: hex_value = '4'; break; case 5: hex_value = '5'; break; case 6: hex_value = '6'; break; case 7: hex_value = '7'; break; case 8: hex_value = '8'; break; case 9: hex_value = '9'; break; case 10: hex_value = 'A'; break; case 11: hex_value = 'B'; break; case 12: hex_value = 'C'; break; case 13: hex_value = 'D'; break; case 14: hex_value = 'E'; break; case 15: hex_value = 'F'; break; default : hex_value = '0'; break; } return hex_value; } // decimal to hexadecimal char __fastcall TPLCEthernet::Uhexadecimal(int value) { char hex_value; switch (value) { case 1: hex_value = '1'; break; case 2: hex_value = '2'; break; case 3: hex_value = '3'; break; case 4: hex_value = '4'; break; case 5: hex_value = '5'; break; case 6: hex_value = '6'; break; case 7: hex_value = '7'; break; case 8: hex_value = '8'; break; case 9: hex_value = '9'; break; default : hex_value = '0'; break; } return hex_value; } //--------------------------------------- String __fastcall TPLCEthernet::decimal2hexadecimal(int value) { int first = value/4096; int fourth = value%4096; int second = fourth/256; fourth = fourth%256; int third = fourth/16; fourth = fourth%16; String hex_value = hexadecimal(first); hex_value = hex_value + hexadecimal(second); hex_value = hex_value + hexadecimal(third); hex_value = hex_value + hexadecimal(fourth); return hex_value; } //--------------------------------------- String __fastcall TPLCEthernet::decimal2hexadecimal_2(int value) { int first = value/1000000; // 16 256 4096 65536 1048576 int sixth = value%1000000; int second = sixth/10000; sixth = sixth%10000; int third = sixth/1000; sixth = sixth%1000; int fourth = sixth/100; sixth = sixth%100; int fifth = sixth/10; sixth = sixth%10; String hex_value = hexadecimal(first); hex_value = hex_value + Uhexadecimal(second); hex_value = hex_value + Uhexadecimal(third); hex_value = hex_value + Uhexadecimal(fourth); hex_value = hex_value + Uhexadecimal(fifth); hex_value = hex_value + Uhexadecimal(sixth); return hex_value; /* int first = value/1048576; // 16 256 4096 65536 1048576 int sixth = value%1048576; int second = sixth/65536; sixth = sixth%65536; int third = sixth/4096; sixth = sixth%4096; int fourth = sixth/256; sixth = sixth%256; int fifth = sixth/16; sixth = sixth%16; String hex_value = hexadecimal(first); hex_value = hex_value + hexadecimal(second); hex_value = hex_value + hexadecimal(third); hex_value = hex_value + hexadecimal(fourth); hex_value = hex_value + hexadecimal(fifth); hex_value = hex_value + hexadecimal(sixth); return hex_value; */ } //--------------------------------------- // hexadecimal to decimal int __fastcall TPLCEthernet::decimal(char value) { int decimal_value; switch (value) { case '1': decimal_value = 1; break; case '2': decimal_value = 2; break; case '3': decimal_value = 3; break; case '4': decimal_value = 4; break; case '5': decimal_value = 5; break; case '6': decimal_value = 6; break; case '7': decimal_value = 7; break; case '8': decimal_value = 8; break; case '9': decimal_value = 9; break; case 'A': decimal_value = 10; break; case 'B': decimal_value = 11; break; case 'C': decimal_value = 12; break; case 'D': decimal_value = 13; break; case 'E': decimal_value = 14; break; case 'F': decimal_value = 15; break; default : decimal_value = 0; break; } return decimal_value; } //--------------------------------------- String __fastcall TPLCEthernet::ReadCommand(int address, int channelnumber) { int i; String command; command = "500000FF03FF000018000004010000D*" + decimal2hexadecimal_2(BaseAddress+address) + decimal2hexadecimal(channelnumber); issendcommand = true; arrayindex1 = address; return command; } //--------------------------------------- String __fastcall TPLCEthernet::WriteCommand(int address, int channelnumber) { int i; String command; int charnumber = channelnumber*4 + 24; command = "500000FF03FF00" + decimal2hexadecimal(charnumber) + "000014010000D*" + decimal2hexadecimal_2(BaseAddress+address) + decimal2hexadecimal(channelnumber); for (i=0 ; i<(channelnumber) ; i++) command += Int16ToHex(array1[address+i]); issendcommand = true; return command; } //--------------------------------------- int __fastcall TPLCEthernet::getresponse(String receive) { int i; int Responsenumber = receive.Length(); int responsevalue=0, count=0; String Response = ""; String substr = ""; returnvalue = returnvalue*10; int returnvalue1; // ?a¨ú|^??-è if (receive[1]=='6' && receive[2]=='0' && receive[3]=='0' && receive[4]=='0') { if (((Responsenumber-8)/4)<10) { returnvalue1 = returnvalue+5; returnvalue = 0; return returnvalue1; } for (i=9; i=Responsenumber ; i+=4) { responsevalue = HexToInt((String)receive[i]+(String)receive[i+1]+(String)receive[i+2]+(String)receive[i+3]); array2[count] = responsevalue; if (Response=="") Response = IntToStr(responsevalue); else Response = Response + "," +IntToStr(responsevalue); count++; if (count==10) { returnvalue = returnvalue+1; break; } } if (Responsenumber>48) { for (i=49 ; i=Responsenumber ; i++) substr += (String)receive[i]; if (substr[1]=='6' && substr[2]=='0' && substr[3]=='0' && substr[4]=='0') issendcommand = false; else issendcommand = true; returnvalue = getresponse(substr); } returnvalue1 = returnvalue; returnvalue = 0; return returnvalue1; } else { issendcommand = false; String completecode = ""; // §P?_|^???X?O§_¥??T for (i=19; i=22; i++) completecode += receive[i]; // ??¤J?X?ù?~?é if (Responsenumber<22) { returnvalue1 = returnvalue + 2; returnvalue = 0; return returnvalue1; } // à??ddata length int datalength = 0; datalength = decimal(receive[15])*4096 + decimal(receive[16])*256 + decimal(receive[17])*16 + decimal(receive[18]); // ??1L?ù?~?X if ((completecode!="0000")) { if ((datalength+18)==Responsenumber) { returnvalue1 = returnvalue + 2; returnvalue = 0; return returnvalue1; } else { // ·ídata length?P|r|êa??פ£¤@???é for (i=(datalength+18) ; i=Responsenumber ; i++) substr += (String)receive[i]; if (substr[1]=='6' && substr[2]=='0' && substr[3]=='0' && substr[4]=='0') issendcommand = false; else issendcommand = true; returnvalue = getresponse(substr); } returnvalue1 = returnvalue; returnvalue = 0; return returnvalue1; } // ??¤J?g¤J?X¥??T?é if (datalength==4) { returnvalue = returnvalue+3; if (Responsenumber==22) { returnvalue1 = returnvalue; returnvalue = 0; return returnvalue1; } else { // ·ídata length?P|r|êa??פ£¤@???é for (i=23 ; i=Responsenumber ; i++) substr += (String)receive[i]; if (substr[1]=='6' && substr[2]=='0' && substr[3]=='0' && substr[4]=='0') issendcommand = false; else issendcommand = true; returnvalue = getresponse(substr); } returnvalue1 = returnvalue; returnvalue = 0; return returnvalue1; } // ?a¨ú|^??-è substr = ""; datalength = datalength + 18; for (i=23; i=datalength ; i+=4) { responsevalue = HexToInt((String)receive[i]+(String)receive[i+1]+(String)receive[i+2]+(String)receive[i+3]); array1[arrayindex1] = responsevalue; if (Response=="") Response = IntToStr(responsevalue); else Response = Response + "," +IntToStr(responsevalue); arrayindex1++; } if (Responsenumber==datalength) { returnvalue1 = returnvalue+4; returnvalue = 0; return returnvalue1; } else { // ·ídata length?P|r|êa??פ£¤@???é for (i=(datalength+1) ; i=Responsenumber ; i++) substr += (String)receive[i]; if (substr[1]=='6' && substr[2]=='0' && substr[3]=='0' && substr[4]=='0') issendcommand = false; else issendcommand = true; returnvalue = returnvalue+4; returnvalue = getresponse(substr); } returnvalue1 = returnvalue; returnvalue = 0; return returnvalue1; } } //--------------------------------------- String TPLCEthernet::BinaryToHex(String inputstr) { int length = inputstr.Length(); int value = 0; char c; String outputstr=""; for (int i=1 ; i=length ; i+=4) { value = 0; if (inputstr[i+3]=='1') value = 1; if (inputstr[i+2]=='1') value += 2; if (inputstr[i+1]=='1') value += 4; if (inputstr[i]=='1') value += 8; c = hexadecimal(value); outputstr += c; } /* for (int i=length ; i>=1 ; i-=8) { value = 0; if (inputstr[i-4]=='1') value = 1; if (inputstr[i-5]=='1') value += 2; if (inputstr[i-6]=='1') value += 4; if (inputstr[i-7]=='1') value += 8; c = hexadecimal(value); outputstr += c; value = 0; if (inputstr[i]=='1') value = 1; if (inputstr[i-1]=='1') value += 2; if (inputstr[i-2]=='1') value += 4; if (inputstr[i-3]=='1') value += 8; c = hexadecimal(value); outputstr += c; } */ return outputstr; } //--------------------------------------- String TPLCEthernet::HexToBinary(String inputstr) { int value, valuetemp; int length = inputstr.Length(); String outputstr="", strtemp1=""; /* outputstr = inputstr; for (int i=1 ; i=length ; i+=2) { outputstr[i] = inputstr[length-i]; outputstr[i+1] = inputstr[length-i+1]; } inputstr = outputstr; */ for (int i=1 ; i=length ; i++) { value = decimal(inputstr[i]); valuetemp = value/8; value = value%8; if (valuetemp==1) strtemp1 += "1"; else strtemp1 += "0"; valuetemp = value/4; value = value%4; if (valuetemp==1) strtemp1 += "1"; else strtemp1 += "0"; valuetemp = value/2; value = value%2; if (valuetemp==1) strtemp1 += "1"; else strtemp1 += "0"; if (value==1) strtemp1 += "1"; else strtemp1 += "0"; } return strtemp1; } //--------------------------------------- String TPLCEthernet::Int16ToHex(int inputvalue) { int valuetemp1; int valuetemp2; String outputstr=""; if (inputvalue<0) valuetemp1 = abs(inputvalue + 1); else valuetemp1 = inputvalue; for (int i=1 ; i=16 ; i++) { valuetemp2 = valuetemp1%2; valuetemp1 = valuetemp1/2; if (valuetemp2==1) outputstr = "1" + outputstr; else outputstr = "0" + outputstr; } if (inputvalue<0) { for (int i=1 ; i=outputstr.Length() ; i++) { if (outputstr[i]=='1') outputstr[i] = '0'; else outputstr[i] = '1'; } } outputstr = BinaryToHex(outputstr); return outputstr; } String TPLCEthernet::Int32ToHex(int inputvalue) { int valuetemp1; int valuetemp2; String outputstr=""; if (inputvalue<0) valuetemp1 = abs(inputvalue + 1); else valuetemp1 = inputvalue; for (int i=1 ; i=32 ; i++) { valuetemp2 = valuetemp1%2; valuetemp1 = valuetemp1/2; if (valuetemp2==1) outputstr = "1" + outputstr; else outputstr = "0" + outputstr; } if (inputvalue<0) { for (int i=1 ; i=outputstr.Length() ; i++) { if (outputstr[i]=='1') outputstr[i] = '0'; else outputstr[i] = '1'; } } outputstr = BinaryToHex(outputstr); return outputstr; } //--------------------------------------- int TPLCEthernet::HexToInt(String inputstr) { String outputstr = HexToBinary(inputstr); int lenght = outputstr.Length(); int m = 2; int e = 0; int output = 0; if (outputstr[1]=='1') { for (int i=lenght ; i>=1 ; i--) { if (outputstr[i]=='0') output += pow(m, e); e++; } output = (output+1)*(-1); } else { for (int i=lenght ; i>=1 ; i--) { if (outputstr[i]=='1') output += pow(m, e); e++; } } return output; } //--------------------------------------- int TPLCEthernet::ReadIntData(int adress) { // array1 return array1[adress]; } double TPLCEthernet::ReadFloatData(int adress,int unit) { String str1 = Int16ToHex(array1[adress+1]); str1 += Int16ToHex(array1[adress]); int value1 = HexToInt(str1); double result = (double)value1/(double)unit; return result; } String TPLCEthernet::WriteIntData(int inputvalue, int adress) { array1[adress] = inputvalue; return "OK"; } String TPLCEthernet::WriteFloatData(double inputvalue, int adress,int unit) { int value1 = (int)(inputvalue*unit); String str1 = Int32ToHex(value1); String str2="", str3=""; for (int i=1 ; i=4 ; i++) { str2 += str1[i]; str3 += str1[i+4]; } int value2 = HexToInt(str2); int value3 = HexToInt(str3); array1[adress+1] = value2; array1[adress] = value3; return "OK"; } int TPLCEthernet::ReadIntCommand(int adress) { // array1 return array2[adress]; } double TPLCEthernet::ReadFloatCommand(int adress,int unit) { String str1 = Int16ToHex(array2[adress+1]); str1 += Int16ToHex(array2[adress]); int value1 = HexToInt(str1); double result = (double)value1/(double)unit; return result; }