protected override void WriteFunction()
        {
            try
            {
                var signalState    = (SignalState)PlcThread.GetState();
                var signalName     = signalState.SignalName;
                var mbInfo         = dicSignals[signalName];
                var register       = mbInfo.Register;
                var numberOfPoints = mbInfo.Count;
                var value          = signalState.Value;
                var data           = new bool[numberOfPoints];

                for (int i = 0; i < numberOfPoints; i++)
                {
                    data[i] = ((int)value & (int)Math.Pow(2, i)) > 0;
                }
                while (!signalState.OutOfDateAlarm)
                {
                    lock (Locker)
                    {
                        try
                        {
                            if (!master.Open())
                            {
                                master.Close();
                                AddMessage("com port not opening", DebugLevel.ExceptionLevel);
                            }

                            if (signalState.UseByDate <= AdvDateTime.Now || !signalState.ChannelLink)
                            {
                                AddMessage(signalName + " useByDate <= Now or channelLink = false",
                                           DebugLevel.FullModeLevel);
                                break;
                            }

                            master.WriteMultipleCoils(slaveAddress, register, numberOfPoints, data);
                            if (master.GetType() == typeof(ModbusASCII) || master.GetType() == typeof(ModbusRTU))
                            {
                                master.Close();
                            }

                            AddMessage(signalName + " register: " + register + " set value: " + value,
                                       DebugLevel.FullModeLevel);
                            signalState.ChannelLink = false;
                            break;
                        }
                        catch (Exception ex)
                        {
                            AddMessage("WriteMultipleCoils catch exception: " + ex.Message, DebugLevel.ExceptionLevel);
                        }
                    }
                    PlcThread.Sleep(50);
                }
            }
            catch (Exception ex)
            {
                AddMessage(": an exception occurred in the function WriteMultipleCoilsThread() [ " +
                           ex.Message + " ]", DebugLevel.ExceptionLevel);
            }
        }
Пример #2
0
 private void CustomWorkThread()
 {
     while (true)
     {
         try
         {
             PlcThread.Sleep(TimeDelay);
             if (workThreadTickCount <= AdvDateTime.TotalEnvironmentTickCount)
             {
                 modbusCommand.Close();
                 PlcThread.Sleep(5000);
             }
         }
         catch (Exception ex)
         {
             AddMessage(device.Name + ": an exception occurred in the function CustomWorkThread(): " + ex.Message,
                        DebugLevel.ExceptionLevel);
         }
     }
 }
Пример #3
0
        protected override void WriteFunction()
        {
            try
            {
                var signalState = (SignalState)PlcThread.GetState();
                var signalName  = signalState.SignalName;
                var mbInfo      = dicSignals[signalName];
                var register    = mbInfo.Register;

                var value = Convert.ToBoolean(signalState.Value);
                if (mbInfo.Invert)
                {
                    value = !value;
                }

                while (!signalState.OutOfDateAlarm)
                {
                    lock (Locker)
                    {
                        try
                        {
                            if (!master.Open())
                            {
                                master.Close();
                                AddMessage("com port not opening", DebugLevel.ExceptionLevel);
                            }

                            if (signalState.UseByDate < AdvDateTime.Now || !signalState.ChannelLink)
                            {
                                AddMessage(signalName + " useByDate < Now or ChannelLink = false", DebugLevel.FullModeLevel);
                                return;
                            }

                            master.WriteSingleCoil(slaveAddress, register, value);
                            if (master.GetType() == typeof(ModbusASCII) || master.GetType() == typeof(ModbusRTU))
                            {
                                master.Close();
                            }

                            AddMessage(signalName + " register: " + register + " set value: " + value,
                                       DebugLevel.FullModeLevel);
                            signalState.ChannelLink = false;
                            break;
                        }
                        catch (Exception ex)
                        {
                            AddMessage("WriteSingleCoil catch exception: " + ex.Message, DebugLevel.ExceptionLevel);
                            if (master.GetType() == typeof(ModbusASCII) || master.GetType() == typeof(ModbusRTU))
                            {
                                master.Close();
                            }
                        }
                    }
                    PlcThread.Sleep(50);
                }
            }
            catch (Exception ex)
            {
                AddMessage(": an exception occurred in the function WriteSingleCoilThread() [ " +
                           ex.Message + " ]", DebugLevel.ExceptionLevel);
            }
        }
Пример #4
0
        protected override void WriteFunction()
        {
            try
            {
                var signalState  = (SignalState)PlcThread.GetState();
                var signalName   = signalState.SignalName;
                var mbInfo       = dicSignals[signalName];
                var register     = mbInfo.Register;
                var minEu        = mbInfo.MinEu;
                var maxEu        = mbInfo.MaxEu;
                var minRaw       = mbInfo.MinRaw;
                var maxRaw       = mbInfo.MaxRaw;
                var euValueBand  = mbInfo.EuValueBandExist;
                var rawValueBand = mbInfo.RawValueBandExist;
                var type         = mbInfo.DataType;
                var byteOrder    = mbInfo.ByteOrder;

                double value = signalState.Value;
                if (euValueBand && (value < minEu || value > maxEu))
                {
                    AddMessage(signalName + ": exceeded the permissible limits. Expect [" + minEu + "; " +
                               maxEu + "], try to write value [" + value + "]", DebugLevel.FullModeLevel);
                    return;
                }

                double rawValue = value;
                if (string.Equals(type, "word") && string.Equals(byteOrder, "1-0"))
                {
                    var  word = value;
                    byte b1   = Convert.ToByte(word / 0x100);
                    byte b2   = Convert.ToByte(word % 0x100);
                    value = (ushort)(256 * b2 + b1);
                    AddMessage("Invert byte order [1-0]. Raw value: " + rawValue + ". New value: " + value,
                               DebugLevel.FullModeLevel);
                }

                if (euValueBand && rawValueBand)
                {
                    value = (value - minEu) / (maxEu - minEu) * (maxRaw - minRaw) + minRaw;
                }
                value = Math.Round(value, 0);

                while (!signalState.OutOfDateAlarm)
                {
                    lock (Locker)
                    {
                        try
                        {
                            if (!master.Open())
                            {
                                master.Close();
                                AddMessage("com port not opening", DebugLevel.ExceptionLevel);
                            }

                            if (signalState.UseByDate <= AdvDateTime.Now || !signalState.ChannelLink)
                            {
                                AddMessage(signalName + " useByDate <= Now or channelLink = false",
                                           DebugLevel.FullModeLevel);
                                break;
                            }

                            master.WriteSingleRegister(slaveAddress, register, (ushort)Math.Round(value, 0));
                            if (master.GetType() == typeof(ModbusASCII) || master.GetType() == typeof(ModbusRTU))
                            {
                                master.Close();
                            }

                            AddMessage(signalName + " register: " + register + " set value: " + value,
                                       DebugLevel.FullModeLevel);
                            signalState.ChannelLink = false;
                            break;
                        }
                        catch (Exception ex)
                        {
                            AddMessage("WriteSingleRegister catch exception: " + ex.Message, DebugLevel.ExceptionLevel);
                            if (master.GetType() == typeof(ModbusASCII) || master.GetType() == typeof(ModbusRTU))
                            {
                                master.Close();
                            }
                        }
                    }
                    PlcThread.Sleep(50);
                }
            }
            catch (Exception ex)
            {
                AddMessage(": an exception occurred in the function WriteSingleRegisterThread() [ " +
                           ex.Message + " ]", DebugLevel.ExceptionLevel);
            }
        }
        protected override void WriteFunction()
        {
            try
            {
                var signalState  = (SignalState)PlcThread.GetState();
                var signalName   = signalState.SignalName;
                var mbInfo       = dicSignals[signalName];
                var register     = mbInfo.Register;
                var minEu        = mbInfo.MinEu;
                var maxEu        = mbInfo.MaxEu;
                var minRaw       = mbInfo.MinRaw;
                var maxRaw       = mbInfo.MaxRaw;
                var euValueBand  = mbInfo.EuValueBandExist;
                var rawValueBand = mbInfo.RawValueBandExist;
                var type         = mbInfo.DataType;
                var byteOrder    = mbInfo.ByteOrder;
                var value        = signalState.Value;
                var data         = new ushort[] { 0, 0 };

                //записываемое значение должно быть в инженерных пределах
                if (euValueBand && (value < minEu || value > maxEu))
                {
                    AddMessage(signalName + ": exceeded the permissible limits. Expect [" + minEu + "; " +
                               maxEu + "], try to write value [" + value + "]", DebugLevel.FullModeLevel);
                    return;
                }

                //если заданы пределы масштабирования - преобразуем
                if (euValueBand && rawValueBand)
                {
                    value = (value - minEu) / (maxEu - minEu) * (maxRaw - minRaw) + minRaw;
                }

                if (string.IsNullOrEmpty(type))
                {
                    type = "word";
                }

                double rawValue = value;
                switch (type)
                {
                case "ushort":
                {
                    var temp = (ushort)value;
                    if (byteOrder.Equals("") || byteOrder.Equals("0-1"))
                    {
                        data[1] = temp;
                    }

                    if (byteOrder.Equals("1-0"))
                    {
                        data[0] = temp;
                    }
                    break;
                }

                case "word":
                {
                    //если надо поменять байты местами
                    if (byteOrder.Equals("1-0"))
                    {
                        var  word = (uint)value;
                        byte b0   = Convert.ToByte(word / 0x100);
                        byte b1   = Convert.ToByte(word % 0x100);
                        value = 256 * b1 + b0;
                        AddMessage("Invert byte order [1-0]. Raw value: " + rawValue + ". New value: " + value,
                                   DebugLevel.FullModeLevel);
                    }
                    data[0] = (ushort)value;
                    break;
                }

                case "float":
                {
                    float  fValue = Convert.ToSingle(value);
                    byte[] bytes  = BitConverter.GetBytes(fValue);
                    if (bytes.Length == 4)
                    {
                        if (byteOrder.Equals("") || byteOrder.Equals("0-1-2-3"))
                        {
                            var word1 = (ushort)(bytes[0] * 256 + bytes[1]);
                            var word2 = (ushort)(bytes[2] * 256 + bytes[3]);
                            data = new[] { word1, word2 };
                        }
                        else if (byteOrder.Equals("1-0-3-2"))
                        {
                            var word1 = (ushort)(bytes[1] * 256 + bytes[0]);
                            var word2 = (ushort)(bytes[3] * 256 + bytes[2]);
                            data = new[] { word1, word2 };
                        }
                        else if (byteOrder.Equals("3-2-1-0"))
                        {
                            var word1 = (ushort)(bytes[0] * 256 + bytes[1]);
                            var word2 = (ushort)(bytes[2] * 256 + bytes[3]);
                            data = new[] { word2, word1 };
                        }
                        else if (byteOrder.Equals("2-3-0-1"))
                        {
                            var word1 = (ushort)(bytes[1] * 256 + bytes[0]);
                            var word2 = (ushort)(bytes[3] * 256 + bytes[2]);
                            data = new[] { word2, word1 };
                        }
                    }
                    break;
                }
                }

                while (!signalState.OutOfDateAlarm)
                {
                    lock (Locker)
                    {
                        try
                        {
                            if (!master.Open())
                            {
                                master.Close();
                                AddMessage("com port not opening", DebugLevel.ExceptionLevel);
                            }

                            if (signalState.UseByDate <= AdvDateTime.Now || !signalState.ChannelLink)
                            {
                                AddMessage(signalName + " useByDate <= Now or channelLink = false",
                                           DebugLevel.FullModeLevel);
                                break;
                            }

                            master.WriteMultipleRegisters(slaveAddress, register, data);
                            if (master.GetType() == typeof(ModbusASCII) || master.GetType() == typeof(ModbusRTU))
                            {
                                master.Close();
                            }

                            AddMessage(signalName + ": euValueBand [" + minEu + ", " + maxEu + "], " +
                                       "rawValueBand [" + minRaw + ", " + maxRaw + "], rawValue: " +
                                       rawValue + ", after conversion: " + value, DebugLevel.FullModeLevel);
                            signalState.ChannelLink = false;
                            break;
                        }
                        catch (Exception ex)
                        {
                            AddMessage("WriteMultipleRegisters catch exception: " + ex.Message, DebugLevel.ExceptionLevel);
                        }
                    }
                    PlcThread.Sleep(50);
                }
            }
            catch (Exception ex)
            {
                AddMessage(": an exception occurred in the function WriteMultipleRegistersThread() [ " +
                           ex.Message + " ]", DebugLevel.ExceptionLevel);
            }
        }