/// <summary> /// 写变量 /// </summary> /// <param name="aModbusItem">变量</param> /// <param name="aValue">值</param> /// <returns>是否写成功</returns> public bool WriteItem(ref ModbusItem aModbusItem, Iolist aValue) { //如果值相等则不需再重写 //if (aModbusItem.Value.ToString().Trim() == "" || aValue.Values.Value.ToString().Trim() == "") // return false; if (aModbusItem.Value.ToString() == aValue.Values.Value.ToString() && Convert.ToDecimal(aValue.Values.Value) != decimal.MaxValue) { return(false); } //if (aModbusItem.Direction == RwDirection.ReadWrite // && (aValue.TagName == "FormerBreakageCount") // || aValue.TagName == "RunCounting" // || aValue.TagName == "StopCounting") //{ // Log.WriteLog(Host.ToString() + "MODBUS WriteJob : " + aValue.TagName // + " , " + aValue.TagCode // + " , " + aModbusItem.Value // + " , " + aValue.Values.ModbusValue.ToString() // + " , " + aValue.Values.Value.ToString() // + " , " + aValue.Values.OPCValue.ToString() // + " , " + aModbusItem.Status.ToString()); //} //写圈或写寄存器模式 CoilOrRegister iCoilOrRegiterMode = CoilOrRegister.Register; //写长度 UInt16 uint16WriteLenth = 0; //写缓存 byte[] bWriteBuffer = new byte[0]; //写数值 ItemValue ivItemValue = new ItemValue(); //判断数据类型 switch (aModbusItem.ItemType) { //WORD类型打包 case "WORD": ivItemValue.Word = Convert.ToInt16(aValue.Values.Value.ToString()); bWriteBuffer = new byte[2]; bWriteBuffer[0] = ivItemValue.B1; bWriteBuffer[1] = ivItemValue.B0; uint16WriteLenth = 1; break; //DWORD类型打包 case "DWORD": ivItemValue.DWord = Convert.ToInt32(aValue.Values.Value.ToString()); bWriteBuffer = new byte[4]; bWriteBuffer[0] = ivItemValue.B1; bWriteBuffer[1] = ivItemValue.B0; bWriteBuffer[2] = ivItemValue.B3; bWriteBuffer[3] = ivItemValue.B2; uint16WriteLenth = 2; break; //FLOAT类型打包 case "FLOAT": ivItemValue.Float = (float)Convert.ToDouble(aValue.Values.Value.ToString()); bWriteBuffer = new byte[4]; bWriteBuffer[0] = ivItemValue.B1; bWriteBuffer[1] = ivItemValue.B0; bWriteBuffer[2] = ivItemValue.B3; bWriteBuffer[3] = ivItemValue.B2; uint16WriteLenth = 2; break; //STRING类型打包 case "STRING": //数值转换为字符串 string strValue = Convert.ToString(aValue.Values.Value.ToString()); //缓存 bWriteBuffer = new byte[10]; //char[] cBuffer = new char[10]; //数据打包 for (int i = 0; i < bWriteBuffer.Length && i < strValue.Length; i++) { bWriteBuffer[i] = (byte)strValue[i]; } //Array.Copy((byte[])cBuffer, 0, bWriteBuffer, 0, 10); uint16WriteLenth = 5; break; case "BOOLEAN": iCoilOrRegiterMode = CoilOrRegister.Coil; bWriteBuffer = new byte[1]; bWriteBuffer[0] = Convert.ToByte(aValue.Values.Value); uint16WriteLenth = 1; break; default: uint16WriteLenth = 0; break; } //写 if (uint16WriteLenth > 0) { switch (iCoilOrRegiterMode) { case CoilOrRegister.Coil: //写线圈 if (WriteSingleCoil(aModbusItem.SlaveID, aModbusItem.ItemAddress, Convert.ToUInt16(bWriteBuffer[0])) == uint16WriteLenth) { //更新值 aModbusItem.Value = aValue.Values.Value; aModbusItem.UpdateTime = DateTime.Now; return(true); } else { return(false); } //break; case CoilOrRegister.Register: //写寄存器 if (WriteMultipleRegisters(aModbusItem.SlaveID, aModbusItem.ItemAddress, uint16WriteLenth, bWriteBuffer) == uint16WriteLenth * 2) { //更新值 aModbusItem.Value = aValue.Values.Value; aModbusItem.UpdateTime = DateTime.Now; return(true); } else { return(false); } //break; default: return(false); //break; } } else { return(false); } //return true; }
/// <summary> /// 写变量 /// </summary> /// <param name="aModbusItem">变量</param> /// <param name="aValue">值</param> /// <returns>是否写成功</returns> public bool WriteItem(ref ModbusItem aModbusItem, Iolist aValue) { //如果值相等则不需再重写 if (aModbusItem.Value.ToString().ToUpper() == aValue.Values.Value.ToString().ToUpper() && Convert.ToDecimal(aValue.Values.Value) != decimal.MaxValue) return false; //写圈或写寄存器模式 CoilOrRegister iCoilOrRegiterMode = CoilOrRegister.Register; //写长度 UInt16 uint16WriteLenth = 0; //写缓存 byte[] bWriteBuffer = new byte[0]; //写数值 ItemValue ivItemValue = new ItemValue(); //判断数据类型 switch (aModbusItem.ItemType) { //WORD类型打包 case "WORD": ivItemValue.Word = Convert.ToInt16(aValue.Values.Value.ToString()); bWriteBuffer = new byte[2]; bWriteBuffer[0] = ivItemValue.B1; bWriteBuffer[1] = ivItemValue.B0; uint16WriteLenth = 1; break; //DWORD类型打包 case "DWORD": ivItemValue.DWord = Convert.ToInt32(aValue.Values.Value.ToString()); bWriteBuffer = new byte[4]; bWriteBuffer[0] = ivItemValue.B1; bWriteBuffer[1] = ivItemValue.B0; bWriteBuffer[2] = ivItemValue.B3; bWriteBuffer[3] = ivItemValue.B2; uint16WriteLenth = 2; break; //FLOAT类型打包 case "FLOAT": ivItemValue.Float = (float)Convert.ToDouble(aValue.Values.Value.ToString()); bWriteBuffer = new byte[4]; bWriteBuffer[0] = ivItemValue.B1; bWriteBuffer[1] = ivItemValue.B0; bWriteBuffer[2] = ivItemValue.B3; bWriteBuffer[3] = ivItemValue.B2; uint16WriteLenth = 2; break; //STRING类型打包 case "STRING": //数值转换为字符串 string strValue = Convert.ToString(aValue.Values.Value.ToString()); //缓存 bWriteBuffer = new byte[10]; //char[] cBuffer = new char[10]; //数据打包 for (int i = 0; i < bWriteBuffer.Length && i < strValue.Length; i++) bWriteBuffer[i] = (byte)strValue[i]; //Array.Copy((byte[])cBuffer, 0, bWriteBuffer, 0, 10); uint16WriteLenth = 5; break; case "BOOLEAN": iCoilOrRegiterMode = CoilOrRegister.Coil; bWriteBuffer = new byte[1]; bWriteBuffer[0] = Convert.ToByte(aValue.Values.Value); uint16WriteLenth = 1; break; default: uint16WriteLenth = 0; break; } //写 if (uint16WriteLenth > 0) { switch (iCoilOrRegiterMode) { case CoilOrRegister.Coil: //写线圈 if (WriteSingleCoil(aModbusItem.SlaveID, aModbusItem.ItemAddress, Convert.ToUInt16(bWriteBuffer[0])) == uint16WriteLenth) { //更新值 aModbusItem.Value = aValue.Values.Value; aModbusItem.UpdateTime = DateTime.Now; return true; } else { return false; } //break; case CoilOrRegister.Register: //写寄存器 if (WriteMultipleRegisters(aModbusItem.SlaveID, aModbusItem.ItemAddress, uint16WriteLenth, bWriteBuffer) == uint16WriteLenth * 2) { //更新值 aModbusItem.Value = aValue.Values.Value; aModbusItem.UpdateTime = DateTime.Now; return true; } else { return false; } //break; default: return false; //break; } } else { return false; } //return true; }