/// <summary> /// 将制定PLC的地址改为新的地址 /// </summary> /// <param name="fOldPLCAddress">原PLC地址</param> /// <param name="fNewPLCAddress">新的PLC地址</param> public void SetPLCAddress(int fNewPLCAddress) { if (PLCActive() && (fSerialPortBus != null)) { if (!string.IsNullOrEmpty(fPLCModbusNode.PLCSNStr)) { int[] fDataBuf = new int[] { CRC16_GB19582.CRC16GB(fPLCModbusNode.PLCSNByteLF, TCRC16Endian.Big), fNewPLCAddress }; // 写入2个字节寄存器 TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.WriteMemoryReg_0x10); fCommand.PLCAddress = (byte)PLCAddress; fCommand.RegWriteAddress = 0; // 写入本机地址 fCommand.RegWriteCount = (ushort)fDataBuf.Length; for (int i = 0; i < fDataBuf.Length; i++) { fCommand.RegValue[i] = (ushort)fDataBuf[i]; } int fTimeOut = 100; fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut); } } else { throw new Exception("目标PLC无法操作!"); } }
/// <summary> /// 写入特殊寄存器值 /// </summary> /// <param name="fRegIdx">寄存器地址序号</param> /// <param name="fADCSet">要设置的值</param> public void WriteSetReg(ushort fRegIdx, ushort fADCSet) { if (PLCActive() && (fSerialPortBus != null)) { int[] fDataBuf = new int[] { CRC16_GB19582.CRC16GB(fPLCModbusNode.PLCSNByteLF, TCRC16Endian.Big), fADCSet }; // 写入2个字节寄存器 TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.WriteMemoryReg_0x10); fCommand.PLCAddress = (byte)PLCAddress; fCommand.RegWriteAddress = fRegIdx; // 写入本机地址 fCommand.RegWriteCount = (ushort)fDataBuf.Length; for (int i = 0; i < fDataBuf.Length; i++) { fCommand.RegValue[i] = (ushort)fDataBuf[i]; } int fTimeOut = 100; fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut); } }
public int SetPLCRunTimeCFG(ushort[] RTCFGDatas) { int fResult = 0; TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.HBHCCommand_0x42); fCommand.PLCAddress = (byte)PLCAddress; fCommand.MainCode = 0x0A; fCommand.SubCode = ADP1701VX.SubCode_SetCFG; fCommand.CryptKey = (ushort)CRC16_GB19582.CRC16GB(PLCSNByteLF, TCRC16Endian.Big); fCommand.RegWriteCount = (ushort)RTCFGDatas.Length; for (int i = 0; i < fCommand.RegWriteCount; i++) { fCommand.RegValue[i] = (ushort)RTCFGDatas[i]; } int fTimeOut = 100; fResult = base.fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut); return(fResult); }
/// <summary> /// 写入PLC的序列号; /// </summary> /// <param name="fPLCSN"></param> /// <param name="fPLCAddress"></param> public void SetPLCSN(byte[] fPLCSN) { if (PLCActive() && (fSerialPortBus != null)) { if ((fPLCSN != null) && (fPLCSN.Length == 12)) { List <ushort> fDataBuf = new List <ushort>(); fDataBuf.Add((ushort)CRC16_GB19582.CRC16GB(PLCSNByteLF, TCRC16Endian.Big)); // 将要写入的PLCSN放入,转换为ushort,高位在前,写入缓冲区 ushort fVTemp = 0; for (int i = 0; i < fPLCSN.Length; i++) { if (i % 2 == 0) //寄存器低位: 0,2,4,6,8,10,12 { fVTemp = fPLCSN[i]; } else { //寄存器高位: 1,3,5,7,9,11 ushort fVT1 = fPLCSN[i]; fVTemp <<= 8; fVTemp |= fVT1; fDataBuf.Add(fVTemp); fVTemp = 0; } } TModbusRTUCommandV2 fCommand = new TModbusRTUCommandV2(ModbusCommand.WriteMemoryReg_0x10); fCommand.PLCAddress = (byte)this.PLCAddress; fCommand.RegWriteAddress = 2; // 写入PLCSN,不是所有PLC都能够写入PLCSN fCommand.RegWriteCount = (ushort)fDataBuf.Count; for (int i = 0; i < fDataBuf.Count; i++) { fCommand.RegValue[i] = fDataBuf[i]; } int fTimeOut = 100; fSerialPortBus.SendModbusCommand(fCommand, ref fTimeOut); } } else { throw new Exception("目标PLC无法操作!"); } }
private void button1_Click(object sender, EventArgs e) { if ((radioButton1.Checked || radioButton2.Checked) && (fModelManager != null) && (fModelManager.PLCConnected)) { int fCRCValue = CRC16_GB19582.CRC16CB(fModelManager.PLCSNByteLF); int[] fDataBuf; fModelManager.Active = false; System.Threading.Thread.Sleep(100); try { // 4-20mA测量 if (radioButton1.Checked) { for (int i = 0; i < 6; i++) { // 单极性测量;PGA增益=1;输入负为AGND fDataBuf = new int[] { fCRCValue, 0x0009 | ((i + 1) << 4) }; fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x08 + i, fDataBuf); System.Threading.Thread.Sleep(5); } // 快速测量模式 fModelManager.CFG_ADCFastMode = true; // 通道2为差分方式测量片上温度温度,PGA增益=32 fModelManager.CFG_T2Balance = false; // 写入系统配置 fDataBuf = new int[] { fCRCValue, fModelManager.Reg_CFG }; fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x0E, fDataBuf); System.Threading.Thread.Sleep(5); // 重启PLC fDataBuf = new int[] { fCRCValue, 1 }; fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 1, fDataBuf); } if (radioButton2.Checked) { for (int i = 0; i < 6; i++) { // 双极性测量;PGA增益=32;输入负为AIN0.7 fDataBuf = new int[] { fCRCValue, 0x1507 | ((i + 1) << 4) }; fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x08 + i, fDataBuf); System.Threading.Thread.Sleep(5); } // 慢速测量模式 fModelManager.CFG_ADCFastMode = false; // 通道2为测量专用平衡片上的绝对电压,PGA增益=1 fModelManager.CFG_T2Balance = true; // 写入系统配置 fDataBuf = new int[] { fCRCValue, fModelManager.Reg_CFG }; fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 0x0E, fDataBuf); System.Threading.Thread.Sleep(5); // 重启PLC fDataBuf = new int[] { fCRCValue, 1 }; fModelManager.WriteRegValueNoFeamon(fModelManager.PLCAddress, 1, fDataBuf); } } finally { fModelManager.Active = true; } this.DialogResult = DialogResult.OK; Close(); } }