Exemple #1
0
        /// <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;
        }
Exemple #2
0
        /// <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;
        }