コード例 #1
0
        public void UpdateValueFromPlc()
        {
            var client = _connection?.PlcClient;

            if (client == null)
            {
                return;
            }

            lock (_connection.PlcClient)
            {
                var retry = 3;
                while (retry-- >= 0)
                {
                    if (!client.Connected)
                    {
                        TronTrace.TraceWarning("No PLC connection");
                        client.Connect();
                    }

                    if (ReadValue())
                    {
                        return;
                    }
                }
                TronTrace.TraceError($"PlcItem.UpdateValueFromPlc failed to read {_info.Name}");
            }
        }
コード例 #2
0
        private void UpdatePlc(object value)
        {
            var client = _connection?.PlcClient;

            if (client == null)
            {
                return;
            }

            lock (client)
            {
                var retry = 3;
                while (retry-- >= 0)
                {
                    if (!client.Connected)
                    {
                        TronTrace.TraceWarning("No PLC connection");
                        client.Connect();
                    }

                    if (WriteValue(value))
                    {
                        return;
                    }
                }
            }
            TronTrace.TraceError($"PlcItem.UpdateValueFromPlc failed to write {_info.Name}");
        }
コード例 #3
0
 public bool Connect()
 {
     PlcClient = new S7Client();
     TronTrace.TraceInformation("PlcConnection: Connect to " + PlcAddress);
     PlcClient.ConnectTo(PlcAddress, PlcRack, PlcSlot);
     if (PlcClient._LastError != 0)
     {
         var text = PlcResult.GetResultText(PlcClient._LastError);
         TronTrace.TraceError("PlcConnection: Connect FAILED : " + text);
     }
     return(IsConnected);
 }
コード例 #4
0
        private bool ReadValue()
        {
            var client = _connection?.PlcClient;

            if (client == null)
            {
                return(false);
            }

            var buffer = new byte[Math.Max(64, _info.ByteCount + 2)];
            var result = client.DBRead(_info.DbNumber, _info.Offset, _info.ByteCount, buffer);

            if (result != 0)
            {
                TronTrace.TraceError($"PlcItem.DBRead({_info.DbNumber}, {_info.Offset}) failed - {result} {PlcResult.GetResultText(result)}");
                return(false);
            }

            switch (_info.PlcDataType)
            {
            case PlcDataTypes.X:
                _value = S7.GetBitAt(buffer, 0, _info.Bit) ? 1 : 0;
                break;

            case PlcDataTypes.B:
                _value = S7.GetByteAt(buffer, 0);
                break;

            case PlcDataTypes.INT:
                _value = S7.GetIntAt(buffer, 0);
                break;

            case PlcDataTypes.DINT:
                _value = S7.GetDIntAt(buffer, 0);
                break;

            case PlcDataTypes.DT:
                _value = S7.GetDateTimeAt(buffer, 0);
                break;

            case PlcDataTypes.STRING:
                _value = S7.GetStringAt(buffer, 0);
                break;
            }

            if (!_value.Equals(_oldValue))
            {
                _oldValue = _value;
                ValueChanged?.Invoke(this);
            }
            return(true);
        }
コード例 #5
0
        public void StartPolling(List <PlcItem> items, int plcPollIntervalMilliseconds)
        {
            _pollItems = items;
            PlcPollIntervalMilliseconds = plcPollIntervalMilliseconds;

            if (PlcPollIntervalMilliseconds > 0)
            {
                TronTrace.TraceInformation($"PlcConnection: Start polling using {PlcPollIntervalMilliseconds}ms interval");
                _pollTimer = new Timer(_ => PollPlc(), this,
                                       TimeSpan.FromMilliseconds(PlcPollIntervalMilliseconds),
                                       TimeSpan.FromMilliseconds(PlcPollIntervalMilliseconds));
            }
        }
コード例 #6
0
        private void DoPollPlc()
        {
            if (PlcClient.Connected != _oldPlcConnected)
            {
                TronTrace.TraceInformation("PlcConnection: Connected = " + PlcClient.Connected);
                _oldPlcConnected = PlcClient.Connected;
            }

            foreach (var plcItem in _pollItems)
            {
                plcItem.UpdateValueFromPlc();
            }
        }
コード例 #7
0
        private bool WriteValue(object value)
        {
            var client = _connection?.PlcClient;

            if (client == null)
            {
                return(false);
            }

            if (!client.Connected)
            {
                return(false);
            }

            var buffer = new byte[_info.ByteCount + 64];

            _value = value ?? throw new ArgumentNullException(nameof(value));

            try
            {
                switch (_info.PlcDataType)
                {
                case PlcDataTypes.X:
                    S7.SetBitAt(ref buffer, 0, _info.Bit, UniversalConverter.ConvertTo <bool>(_value));
                    break;

                case PlcDataTypes.B:
                    S7.SetByteAt(buffer, 0, UniversalConverter.ConvertTo <byte>(_value));
                    break;

                case PlcDataTypes.INT:
                    S7.SetIntAt(buffer, 0, UniversalConverter.ConvertTo <short>(_value));
                    break;

                case PlcDataTypes.DINT:
                    S7.SetDIntAt(buffer, 0, UniversalConverter.ConvertTo <int>(_value));
                    break;

                case PlcDataTypes.DT:
                    S7.SetDateTimeAt(buffer, 0, UniversalConverter.ConvertTo <DateTime>(_value));
                    break;

                case PlcDataTypes.STRING:
                    var text = UniversalConverter.ConvertTo <string>(_value);
                    if (text.Length > _info.MaxStringLength)
                    {
                        text = text.Substring(0, _info.MaxStringLength);
                    }
                    S7.SetStringAt(buffer, 0, _info.MaxStringLength, text);
                    break;
                }

                var result = (_info.PlcDataType == PlcDataTypes.X)
                                    ? client.WriteArea(_info.PlcArea, _info.DbNumber, _info.Offset, _info.ByteCount, _info.PlcWordLen, buffer)
                                    : client.DBWrite(_info.DbNumber, _info.Offset, _info.ByteCount, buffer);
                if (result == 0)
                {
                    return(true);
                }

                TronTrace.TraceError($"PlcItem.DBWrite({_info.DbNumber}, {_info.Offset}) failed - {result} {PlcResult.GetResultText(result)}");
            }
            catch (Exception ex)
            {
                TronTrace.TraceError($"PlcItem.DBWrite({_info.DbNumber}, {_info.Offset}) failed - {ex.Message}");
            }
            return(false);
        }