示例#1
0
 bool WriteModbusData(MBRTU_Master ModbusRtu, byte SlaveAddr, ushort ModbusAddr, string datatype, string sValue)
 {
     ComSync = true;
     //modbus 写延时
     Thread.Sleep(100);
     ushort ntype = (ushort)(ModbusAddr / 10000);
     ushort naddr = (ushort)(ModbusAddr % 10000);
     bool bok = false;
     naddr = (ushort)(naddr - 1);
     switch (ntype)
     {
         case 0://DO
             short[] coils = new short[1];
             if (sValue.Equals("1"))
             {
                 coils[0] = 1;
             }
             else
             {
                 coils[0] = 0;
             }
             bok = ModbusRtu.SendFc5(SlaveAddr, naddr, coils[0]);
             break;
         case 4://AO
             if (datatype.Equals("uint16"))
             {
                 ushort[] registerhold = new ushort[1];
                 registerhold[0] = ushort.Parse(sValue);
                 bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 1, registerhold);
             }
             else if (datatype.Equals("int16"))
             {
                 ushort[] registerhold = new ushort[1];
                 registerhold[0] = (ushort)short.Parse(sValue);
                 bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 1, registerhold);
             }
             else if (datatype.Equals("float"))
             {
                 ushort[] registerhold = new ushort[2];
                 int intValue = int.Parse(sValue);
                 registerhold[1] = (ushort)(intValue >> 16);
                 registerhold[0] = (ushort)intValue;
                 bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 2, registerhold);
             }
             else if (datatype.Equals("uint32"))
             {
                 ushort[] registerhold = new ushort[2];
                 int intValue = int.Parse(sValue);
                 registerhold[1] = (ushort)(intValue >> 16);
                 registerhold[0] = (ushort)intValue;
                 bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 2, registerhold);
             }
             else if (datatype.Equals("int32"))
             {
                 ushort[] registerhold = new ushort[2];
                 int intValue = int.Parse(sValue);
                 registerhold[1] = (ushort)(intValue >> 16);
                 registerhold[0] = (ushort)intValue;
                 bok = ModbusRtu.SendFc16(SlaveAddr, naddr, 2, registerhold);
             }
             break;
     }
     ComSync = false;
     return bok;
 }
示例#2
0
        void ReadModbusData(MBRTU_Master ModbusRtu, byte SlaveAddr, ushort ModbusAddr, string datatype, ushort nNumber, ref string[] sValue)
        {
            if (ComSync)
            {
                return;
            }
            ushort ntype = (ushort)((ModbusAddr / 10000));
            ushort naddr = (ushort)((ModbusAddr % 10000));
            naddr = (ushort)(naddr - 1);
            switch (ntype)
            {
                case 0://DO
                    ushort[] coils = new ushort[nNumber];
                    bool bcoils = ModbusRtu.SendFc1(SlaveAddr, naddr, nNumber, ref coils);
                    if (bcoils)
                    {
                        for (int i = 0; i < nNumber; i++)
                        {
                            sValue[i] = coils[i].ToString();
                        }
                    }
                    else
                    {
                        for (int i = 0; i < nNumber; i++)
                        {
                            sValue[i] = "0";
                        }
                    }
                    break;
                case 1://DI
                    ushort[] dis = new ushort[nNumber];
                    bool bdis = ModbusRtu.SendFc2(SlaveAddr, naddr, nNumber, ref dis);
                    if (bdis)
                    {
                        for (int i = 0; i < nNumber; i++)
                        {
                            sValue[i] = dis[i].ToString();
                        }
                    }
                    else
                    {
                        for (int i = 0; i < nNumber; i++)
                        {
                            sValue[i] = "0";
                        }
                    }
                    break;
                case 4://AO
                    if (datatype.Equals("uint16"))
                    {
                        ushort[] registerhold = new ushort[nNumber];
                        bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, nNumber, ref registerhold);
                        if (bhold)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = registerhold[i].ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("int16"))
                    {
                        ushort[] registerhold = new ushort[nNumber];
                        bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, nNumber, ref registerhold);
                        if (bhold)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = ((short)registerhold[i]).ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("float"))
                    {
                        ushort[] registerhold = new ushort[2 * nNumber];
                        bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerhold);
                        if (bhold)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                int intValue = (int)registerhold[i * 2 + 1];
                                intValue <<= 16;
                                intValue += (int)registerhold[i * 2 + 0];
                                sValue[i] = BitConverter.ToSingle(BitConverter.GetBytes(intValue), 0).ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("int32"))
                    {
                        ushort[] registerhold = new ushort[2 * nNumber];
                        bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerhold);
                        if (bhold)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                int intValue = (int)registerhold[2 * i + 1];
                                intValue <<= 16;
                                intValue += (int)registerhold[2 * i + 0];
                                sValue[i] = intValue.ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("uint32"))
                    {
                        ushort[] registerhold = new ushort[2 * nNumber];
                        bool bhold = ModbusRtu.SendFc3(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerhold);
                        if (bhold)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                UInt32 intValue = (UInt32)registerhold[2 * i + 1];
                                intValue <<= 16;
                                intValue += (UInt32)registerhold[2 * i + 0];
                                sValue[i] = intValue.ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    break;

                case 3://AI
                    if (datatype.Equals("uint16"))
                    {
                        ushort[] registerinput = new ushort[nNumber];
                        bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, nNumber, ref registerinput);
                        if (binput)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = registerinput[i].ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("int16"))
                    {
                        ushort[] registerinput = new ushort[nNumber];
                        bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, nNumber, ref registerinput);
                        if (binput)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = ((short)registerinput[i]).ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("float"))
                    {
                        ushort[] registerinput = new ushort[2 * nNumber];
                        bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerinput);
                        if (binput)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                int intValue = (int)registerinput[2 * i + 1];
                                intValue <<= 16;
                                intValue += (int)registerinput[2 * i + 0];
                                sValue[i] = BitConverter.ToSingle(BitConverter.GetBytes(intValue), 0).ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("int32"))
                    {
                        ushort[] registerinput = new ushort[2 * nNumber];
                        bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerinput);
                        if (binput)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                int intValue = (int)registerinput[2 * i + 1];
                                intValue <<= 16;
                                intValue += (int)registerinput[2 * i + 0];
                                sValue[i] = intValue.ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    else if (datatype.Equals("uint32"))
                    {
                        ushort[] registerinput = new ushort[2 * nNumber];
                        bool binput = ModbusRtu.SendFc4(SlaveAddr, naddr, (ushort)(2 * nNumber), ref registerinput);
                        if (binput)
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                UInt32 intValue = (UInt32)registerinput[2 * i + 1];
                                intValue <<= 16;
                                intValue += (UInt32)registerinput[2 * i + 0];
                                sValue[i] = intValue.ToString();
                            }
                        }
                        else
                        {
                            for (int i = 0; i < nNumber; i++)
                            {
                                sValue[i] = "0";
                            }
                        }
                    }
                    break;
            }
        }