using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using ProjectBase.Data.BaseDAL; using ProjectBase.Data.Logs; using S7.Net; using SIMDP.BLL; using SIMDP.Device; using SIMDP.Model; using ProjectBase.Util; namespace SIMDP.Project { class PlcS7NetDemo : PlcS7Net { #region 重写父类函数 public override void actionStart() { // 启动手持扫码器 //scanner1.Start("192.168.1.101", 4001, new Action((data) => { ShareVar.barcodeScanner1 += data; })); //scanner2.Start("192.168.1.102", 4001, new Action((data) => { ShareVar.barcodeScanner2 += data; })); } public override void actionStop() { //scanner1.Stop(); //scanner2.Stop(); } bool pcHeartBeat = false; string signalName = ""; public override void actionTimer() { try { // 心跳信号 pcHeartBeat = !pcHeartBeat; Write("PC心跳信号", pcHeartBeat); // 轮询监控节点 foreach (var p in monitorPoints) { object value; if (!Read(p, out value)) continue; if (!value.Equals(p.value)) { p.value = value; if (p.proc != null) p.proc.Invoke(this, new object[] { value }); } } redis.Publish(SysEnvironment.OpcDataChannel, ""); } catch (Exception ex) { LogHelper.log.Error("读取PLC(" + S7Plc.IP + ")信号(" + signalName + ")发生异常:" + ex.Message); S7Plc.Close(); SetRedisPlcDisConnect(); } } #endregion #region 自定义功能 /// /// 手持扫码器接收线程 /// RecvScanner scanner1 = new RecvScanner(); RecvScanner scanner2 = new RecvScanner(); public void 读写测试(object value) { bool signal = Convert.ToBoolean(value); LogHelper.log.Debug("读写测试 Start, signal = " + signal.ToString()); if (signal) { object data; Read("READ", out data); short num = Convert.ToInt16(data); Write("WRITE", num + 1); } else { object data; Read("WRITE", out data); short num = Convert.ToInt16(data); Write("READ", num + 1); } } private void 调试模式(object value) { bool signal = Convert.ToBoolean(value); LogHelper.log.Debug("调试模式 Start, signal = " + signal.ToString()); if (signal) { Task.Run(() => { for (int i = 0; i < 1; i++) { TestRunner runner = new TestRunner(this); runner.run(); Thread.Sleep(20000); } }); } } #endregion #region 调试模拟信号 public class TestRunner { Plc TestPlc; PlcS7NetDemo parent; public TestRunner(PlcS7NetDemo _parent) { parent = _parent; S7NetPlcConfig plcConfig = new S7NetPlcConfig(parent.plcInfo.LinkConfig); TestPlc = new Plc(plcConfig.CPU, plcConfig.IP, plcConfig.RACK, plcConfig.SLOT); } public void run() { Task.Run(() => { TestPlc.Open(); // 模拟PLC端信号 TestPlc.Close(); }); } // 读信号 public bool Read2(string dataPointName, out object value) { value = null; if (!parent.allPoints.ContainsKey(dataPointName)) { return false; } S7NetDataPointInfo p = parent.allPoints[dataPointName]; switch (p.TYPE) { case VarType.Bit: value = Convert.ToBoolean(TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR, p.TYPE, 1, p.BIT)); break; case VarType.Byte: value = Convert.ToByte(TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR, p.TYPE, 1)); break; case VarType.Int: value = Convert.ToInt16(TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR, p.TYPE, 1)); break; case VarType.Word: value = Convert.ToUInt16(TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR, p.TYPE, 1)); break; case VarType.DInt: value = Convert.ToInt32(TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR, p.TYPE, 1)); break; case VarType.DWord: value = Convert.ToUInt32(TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR, p.TYPE, 1)); break; case VarType.Real: value = Convert.ToDouble(TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR, p.TYPE, 1)); break; case VarType.String: byte length = (byte)TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR + 1, VarType.Byte, 1); value = TestPlc.Read(DataType.DataBlock, p.DB, p.ADDR + 2, p.TYPE, length).ToString(); break; default: value = null; return false; } return true; } // 等待反馈信号 private void ReadUntil(string pointName, object target) { object value = null; while (true) { Read2(pointName, out value); if (value == target) break; else Thread.Sleep(1000); } } // 写信号 public bool Write2(string dataPointName, object value) { if (!parent.allPoints.ContainsKey(dataPointName)) { return false; } S7NetDataPointInfo p = parent.allPoints[dataPointName]; switch (p.TYPE) { case VarType.Bit: TestPlc.WriteBit(DataType.DataBlock, p.DB, p.ADDR, p.BIT, Convert.ToBoolean(value)); break; case VarType.Byte: TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR, Convert.ToByte(value)); break; case VarType.Int: TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR, Convert.ToInt16(value)); break; case VarType.Word: TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR, Convert.ToUInt16(value)); break; case VarType.DInt: TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR, Convert.ToInt32(value)); break; case VarType.DWord: TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR, Convert.ToUInt32(value)); break; case VarType.Real: TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR, Convert.ToDouble(value)); break; case VarType.String: TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR + 1, Convert.ToByte(value.ToString().Length)); TestPlc.Write(DataType.DataBlock, p.DB, p.ADDR + 2, value.ToString()); break; default: return false; } return true; } } #endregion } }