/// <summary> /// 设置新地址 /// </summary> /// <param name="wAddr"></param> /// <param name="er"></param> /// <returns></returns> public bool SetNewAddr(int wAddr, out string er) { er = string.Empty; try { string wCmd = string.Empty; string rData = string.Empty; string rVal = string.Empty; wCmd = "00" + "00" + "00" + "05" + wAddr.ToString("X2"); wCmd = SOI + wCmd + CalCheckSum(wCmd) + EOI; int rLen = 7; if (!com.send(wCmd, rLen, out rData, out er, _TimeOut)) { return(false); } if (!ToCheckSum(rData, ref rVal)) { er = "检验和错误:" + rData; return(false); } return(true); } catch (Exception e) { er = e.ToString(); return(false); } }
/// <summary> /// 控制Y1-Y6 /// </summary> /// <param name="wAddr"></param> /// <param name="relayNo">iRly=0:所有Y点ON-OFF</param> /// <param name="OnOff"></param> /// <param name="er"></param> /// <returns></returns> public bool CtrlYRelay(int wAddr, int relayNo, int OnOff, out string er) { er = string.Empty; try { string wCmd = string.Empty; string rData = string.Empty; string rVal = string.Empty; wCmd = wAddr.ToString("X2") + "01" + "01" + "06" + relayNo.ToString("X2") + OnOff.ToString("X2"); wCmd = SOI + wCmd + CalCheckSum(wCmd) + EOI; int rLen = 0; if (!com.send(wCmd, rLen, out rData, out er)) { return(false); } return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 读取X1-X8 /// </summary> /// <param name="wAddr"></param> /// <param name="X">X1-X8</param> /// <param name="er"></param> /// <returns></returns> public bool ReadInSingal(int wAddr, out List <EX> X, out string er) { X = new List <EX>(); er = string.Empty; try { string wCmd = string.Empty; string rData = string.Empty; string rVal = string.Empty; wCmd = wAddr.ToString("X2") + "00" + "05" + "04"; wCmd = SOI + wCmd + CalCheckSum(wCmd) + EOI; int rLen = 8; if (!com.send(wCmd, rLen, out rData, out er)) { return(false); } if (!ToCheckSum(rData, ref rVal)) { er = CLanguage.Lan("检验和错误:") + rData; return(false); } int inputSgn = System.Convert.ToInt32(rVal, 16); for (int i = 0; i < 8; i++) { if ((inputSgn & (1 << i)) == (1 << i)) { X.Add(EX.XOFF); } else { X.Add(EX.XON); } } return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 读线圈 /// 从机地址(1Byte)+功能码(1Byte)+寄存器地址(2Byte)+地址数量(2Byte)+CRC检验(2Byte) /// </summary> /// <param name="devType">地址类型</param> /// <param name="regAddr">开始地址</param> /// <param name="N">地址长度</param> /// <param name="rData">16进制字符:数据值高位在前,低位在后</param> /// <param name="er"></param> /// <returns></returns> public bool Read(int devAddr, int regAddr, int N, out string rData, out string er) { rData = string.Empty; er = string.Empty; try { int rLen = N * 2; string wCmd = devAddr.ToString("X2"); wCmd += "03"; //寄存器功能码为03 wCmd += regAddr.ToString("X4"); //开始地址 wCmd += N.ToString("X4"); //读地址长度---1Byte wCmd += CCRC.Crc16(wCmd); //CRC16 低位前,高位后 if (!com.send(wCmd, 5 + rLen, out rData, out er)) { return(false); } if (!checkCRC(rData)) { er = CLanguage.Lan("crc16检验和错误") + ":" + rData; return(false); } string temp = rData.Substring(6, rLen * 2); rData = temp; //2个字节为寄存器值,高在前,低位在后,寄存器小排最前面; //转换为寄存器小排最后 rData = string.Empty; for (int i = 0; i < temp.Length / 4; i++) { rData = temp.Substring(i * 4, 4) + rData; } return(true); } catch (Exception e) { er = e.ToString(); return(false); } }
/// <summary> /// 发串口信息 /// </summary> /// <param name="wData"></param> /// <param name="rLen"></param> /// <param name="rData"></param> /// <param name="er"></param> /// <param name="wTimeOut"></param> /// <returns></returns> private bool SendCmdToDDLoad(string wData, int rLen, out string rData, out string er, int wTimeOut = 200) { rData = string.Empty; er = string.Empty; try { string recvData = string.Empty; if (!com.send(wData, rLen, out recvData, out er, wTimeOut)) { return(false); } if (rLen > 0) { if (!DD_CheckSum(recvData, ref er)) { return(false); } rData = recvData.Substring(10, recvData.Length - 16); } return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 发送和接收数据 /// </summary> /// <param name="wAddr"></param> /// <param name="wData"></param> /// <param name="rLen"></param> /// <param name="rData"></param> /// <param name="er"></param> /// <param name="wTimeOut"></param> /// <returns></returns> private bool sendCmdToHP(string wData, out string rData, out string er, string rEOI = "\r\n", int wTimeOut = 1000) { rData = string.Empty; er = string.Empty; try { string recvData = string.Empty; wData += "\r\n"; //wData += "\n"; if (!com.send(wData, rEOI, out rData, out er, wTimeOut)) { return(false); } rData = rData.Replace("\r", ""); rData = rData.Replace("\n", ""); return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 发送和接收数据 /// </summary> /// <param name="wAddr"></param> /// <param name="wData"></param> /// <param name="rLen"></param> /// <param name="rData"></param> /// <param name="er"></param> /// <param name="wTimeOut"></param> /// <returns></returns> private bool SendCmdToELoad(string wData, int rLen, out string rData, out string er, int wTimeOut = 300) { rData = string.Empty; er = string.Empty; string rVal = string.Empty; try { string recvData = string.Empty; if (!com.send(wData, rLen, out recvData, out er, wTimeOut)) { return(false); } //if (rLen > 0) //{ // if (!ReturnResult(recvData, out rVal, out er)) // return false; // rData = rVal; //} rData = recvData; return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 发串口数据并接收数据 /// </summary> /// <param name="wCmd"></param> /// <param name="rLen"></param> /// <param name="rData"></param> /// <param name="er"></param> /// <param name="wTimeOut"></param> /// <returns></returns> private bool SendCmdToCOM(string wCmd, int rLen, out string rData, out string er, int wTimeOut = 200) { rData = string.Empty; er = string.Empty; try { string recvData = string.Empty; if (!com.send(wCmd, rLen, out recvData, out er, wTimeOut)) { return(false); } rData = recvData; return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 发送和接收数据 /// </summary> /// <param name="wAddr"></param> /// <param name="wData"></param> /// <param name="rLen"></param> /// <param name="rData"></param> /// <param name="er"></param> /// <param name="wTimeOut"></param> /// <returns></returns> private bool SendCmdToHP(string wData, out string rData, out string er, string rEOI = "\n", int wTimeOut = 1000) { rData = string.Empty; er = string.Empty; try { string recvData = string.Empty; wData += "\n"; if (!com.send(wData, rEOI, out rData, out er, wTimeOut)) { return(false); } rData = rData.Replace("\r", ""); rData = rData.Replace("\n", ""); if (rData == Encoding.ASCII.GetString(new Byte[1] { 0x15 })) { er = "传输指令字符串错误:" + wData.Replace("\n", ""); return(false); } return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 发送和接收数据 /// </summary> /// <param name="wAddr"></param> /// <param name="wData"></param> /// <param name="rLen"></param> /// <param name="rData"></param> /// <param name="er"></param> /// <param name="wTimeOut"></param> /// <returns></returns> private bool sendCmdToHP(string wData, out string rData, out string er, string rEOI = "\r\n", int wTimeOut = 2000) { rData = string.Empty; er = string.Empty; try { Thread.Sleep(30); string recvData = string.Empty; wData = "{" + wData + "}"; if (!com.send(wData, rEOI, out rData, out er, wTimeOut)) { return(false); } return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
private bool SendDeltaCommand(int plcAddr, string wCommandType, ERegType wDataType, int wStartAddr, int wWordCount, int wReadWhite, string wWriteContent, out string rData, out string er) { rData = string.Empty; er = string.Empty; try { string strCommand = string.Empty; strCommand += plcAddr.ToString("X2"); strCommand += getFunctioncode(wDataType, wReadWhite); strCommand += checkAddrs(wDataType, wStartAddr); strCommand += wWriteContent; strCommand += codeLRC(strCommand); strCommand += Chr(13); strCommand += Chr(10); strCommand = wCommandType + strCommand; int rLen = 0; int lngWordLen = 4; if (wReadWhite == 1) { rLen = 17; } else { rLen = 11 + lngWordLen * wWordCount; } if (!com.send(strCommand, rLen, out rData, out er)) { return(false); } if (!verifyReceive(rData, ref er)) { er = er + rData; return(false); } if (wReadWhite == 1) //write { rData = "OK"; } else //read { rData = rData.Substring(7, lngWordLen * wWordCount); } return(true); } catch (Exception e) { er = e.ToString(); return(false); } }
/// <summary> /// 启动机组 /// </summary> /// <param name="devAddr"></param> /// <param name="er"></param> /// <returns></returns> public bool Start(int devAddr, out string er) { er = string.Empty; try { string wCmd = devAddr.ToString("X2"); string rData = string.Empty; int regAddr = 0; int rLen = 8; wCmd += "05"; //寄存器功能码为05 wCmd += regAddr.ToString("X4"); //开机命令0000 wCmd += "FF00"; //有效命令FF00 无效命令0000 wCmd += CCRC.Crc16(wCmd); //CRC16 低位前,高位后 if (!com.send(wCmd, rLen, out rData, out er)) { return(false); } if (!checkCRC(rData)) { er = "crc16检验和错误:" + rData; return(false); } return(true); } catch (Exception ex) { er = ex.ToString(); return(false); } }
/// <summary> /// 发送和接收数据 /// </summary> /// <param name="wAddr"></param> /// <param name="wData"></param> /// <param name="rLen"></param> /// <param name="rData"></param> /// <param name="er"></param> /// <param name="wTimeOut"></param> /// <returns></returns> private bool sendCmdToHP(string wData, out string rData, out string er, string rEOI = "\r\n", int wTimeOut = 1000) { string recvData = string.Empty; wData += "\r\n"; if (!com.send(wData, rEOI, out rData, out er, wTimeOut)) { return(false); } rData = rData.Replace("\r\n", ""); return(true); }
/// <summary> /// 设置新地址 /// </summary> /// <param name="wAddr"></param> /// <param name="er"></param> /// <returns></returns> public bool SetNewAddr(int wAddr, out string er) { er = string.Empty; try { string Cmd = "01"; string Info = wAddr.ToString("X4"); string rData = string.Empty; string rVal = string.Empty; string wCmd = CalSendCmdFormat(0, Cmd, Info); int rLen = 6 + 2 * 1; if (!com.send(wCmd, rLen, out rData, out er, _TimeOut)) { return(false); } if (!CalRtnData(rData, out rVal, out er)) { return(false); } return(true); } catch (Exception e) { er = e.ToString(); return(false); } }
/// <summary> /// 读线圈 /// 从机地址(1Byte)+功能码(1Byte)+寄存器地址(2Byte)+地址数量(2Byte)+CRC检验(2Byte) /// </summary> /// <param name="devType">地址类型</param> /// <param name="regAddr">开始地址</param> /// <param name="N">地址长度</param> /// <param name="rData">16进制字符:数据值高位在前,低位在后</param> /// <param name="er"></param> /// <returns></returns> public bool Read(int devAddr, ERegType regType, int regAddr, int N, out string rData, out string er) { rData = string.Empty; er = string.Empty; try { string wCmd = devAddr.ToString("X2"); int rLen = 0; if (regType != ERegType.D) { wCmd += "01"; //线圈功能码为01 rLen = (N + 7) / 8; //8个线圈为1Byte:前8个线圈存第1字节,最小线圈存最低位 } else { wCmd += "03"; //寄存器功能码为03 rLen = N * 2; } wCmd += regAddr.ToString("X4"); //开始地址 wCmd += N.ToString("X2"); //读地址长度---1Byte wCmd += CCRC.Crc16(wCmd); //CRC16 低位前,高位后 if (!com.send(wCmd, 5 + rLen, out rData, out er)) { return(false); } if (!checkCRC(rData)) { er = CLanguage.Lan("crc16检验和错误") + ":" + rData; return(false); } string temp = rData.Substring(6, rLen * 2); if (regType != ERegType.D) { //转化线圈数据为 Mn,Mn-1..M1,M0(高位在前,低位在后) string coil_HL = string.Empty; int coilLen = temp.Length / 2; for (int i = 0; i < coilLen; i++) { coil_HL += temp.Substring(temp.Length - (i + 1) * 2, 2); } rData = coil_HL; } else { rData = temp; //2个字节为寄存器值,高在前,低位在后,寄存器小排最前面; //转换为寄存器小排最后 rData = string.Empty; for (int i = 0; i < temp.Length / 4; i++) { rData = temp.Substring(i * 4, 4) + rData; } } return(true); } catch (Exception e) { er = e.ToString(); return(false); } }
private bool SendOmronCommand(int plcAddr, string wCommandType, ERegType wRegType, int wStartAddr, int wStartBit, int wWordCount, string wWriteContent, out string rData, out string er) { rData = string.Empty; er = string.Empty; try { if (wWriteContent != string.Empty) { for (int i = 0; i < wWordCount; i++) { wWriteContent = "0000" + wWriteContent; } wWriteContent = wWriteContent.Substring(wWriteContent.Length - wWordCount * 4, wWordCount * 4); } string strCommand; strCommand = c_SOI + plcAddr.ToString("X2") + "FA000000000"; strCommand += wCommandType; strCommand += getRegAddr(wRegType); strCommand += wStartAddr.ToString("X4") + wStartBit.ToString("X2"); strCommand += wWordCount.ToString("X4"); if (wRegType == ERegType.WB) { strCommand += wWriteContent.Substring(wWriteContent.Length - 2, 2); } else { strCommand += wWriteContent; } strCommand += codeFcs(strCommand); strCommand += c_EOI; int lngWordLen = 0; if (wWriteContent == string.Empty) { lngWordLen = 4; } int rLen = 27 + lngWordLen * wWordCount; if (!com.send(strCommand, rLen, out rData, out er)) { return(false); } if (!verifyReceive(plcAddr, rData, wCommandType)) { er = CLanguage.Lan("接收数据错误") + "[checkSum]:" + rData; return(false); } if (wWriteContent != string.Empty) //write { rData = "OK"; } else //read { rData = rData.Substring(23, lngWordLen * wWordCount); } return(true); } catch (Exception e) { er = e.ToString(); return(false); } }