123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- using Houdar.PLC.Driver.Simenss;
- using Houdar.PLC.Driver.Simenss.Protocol.Common;
- using Houdar.PLC.Driver.Simenss.Protocol.ReadData;
- using System;
- using WCS.Data;
- using WCS.Data.Utils;
- namespace WCS.PLC
- {
- public class PLC
- {
- private readonly object olock = new object();
- private string _plc_name = string.Empty;
- private PlcErrorCount _plcErrorCount = new PlcErrorCount() { ErrorCount = 0, LastTime = DateTime.MinValue };
- private Action StopPlcEvent;
- internal SimenssPlc _splc = null;
- public PLC() { _splc = new SimenssPlc(); }
- //slot 插槽,port 端口,rack 道轨
- public bool Connect(string ip, int rack, int slot)
- {
- if (_splc.ConnectTo(ip, rack, slot))
- return true;
- return false;
- }
- public bool Connect(string ip, int rack, int slot, string plc_name)
- {
- if (_splc.ConnectTo(ip, rack, slot))
- {
- _plc_name = plc_name;
- _splc.RegisterMessageEvent(PrintMsg);
- return true;
- }
- return false;
- }
- #region 读取值;
- public object ReadSignal(ushort DBNumber, ushort start, ushort len)
- {
- object obj = 0;
- byte[] msg = new byte[len];
- if (Read(DBNumber, start, len, ref msg))
- {
- if (len == 1)
- {
- //obj = BitConverter.ToUInt16(bt,0);
- obj = msg[0];
- }
- else if (len == 2)
- {
- //byte[] temp = new byte[2];
- //temp[0] = bt[1];
- //temp[1] = bt[0];
- //obj = BitConverter.ToInt16(temp, 0);
- obj = Convert.ToUInt16(msg[0] * 256 + msg[1]);
- }
- else if (len == 4)
- {
- //byte[] temp = new byte[4];
- //temp[0] = bt[3];
- //temp[1] = bt[2];
- //temp[2] = bt[1];
- //temp[3] = bt[0];
- //obj = BitConverter.ToInt16(temp, 0);
- obj = Convert.ToUInt32(msg[0] * 256 * 256 * 256 + msg[1] * 256 * 256 + msg[2] * 256 + msg[3]);
- }
- }
- else
- {
- obj = 0;
- }
- return obj;
- }
- public bool ReadBit(ushort DBNumber, ushort start)
- {
- if (_splc.Connected)
- {
- DataItem di = _splc.ReadArea(AreaType.DB, DBNumber, start, 1, DataType.Bit);
- if (di != null && di.Err == ResultCode.OKFF)
- {
- return Convert.ToBoolean(di.Data[0]);
- }
- else
- {
- if (di != null)
- Log4netHelper.Logger_Error.ErrorFormat(di.Err.ToString());
- return false;
- }
- }
- Log4netHelper.Logger_Error.ErrorFormat("PLC未连接。");
- return false;
- }
- public bool ReadBitArea(ushort DBNumber, ushort start, ushort len, ref byte[] msg)
- {
- if (_splc.Connected)
- {
- for (int i = 0; i < len; i++)
- {
- DataItem di = _splc.ReadArea(AreaType.DB, DBNumber, (ushort)i, 1, DataType.Bit);
- if (di != null && di.Err == ResultCode.OKFF)
- {
- msg[i] = di.Data[0];
- //return true;
- }
- else
- {
- if (di != null)
- Log4netHelper.Logger_Error.ErrorFormat(di.Err.ToString());
- return false;
- }
- }
- return true;
- }
- Log4netHelper.Logger_Error.ErrorFormat("PLC未连接。");
- return false;
- }
- public bool Read(ushort DBNumber, ushort start, ushort len, ref byte[] msg)
- {
- if (_splc.Connected)
- {
- DataType dt;
- if (len == 1) dt = DataType.Byte;
- else if (len == 2) dt = DataType.Word;
- else if (len == 4) dt = DataType.DWord;
- else return false;
- DataItem di = _splc.ReadArea(AreaType.DB, DBNumber, start, len, dt);
- if (di != null && di.Err == ResultCode.OKFF)
- {
- msg = di.Data;
- return true;
- }
- else
- {
- if (di != null)
- Log4netHelper.Logger_Error.ErrorFormat(di.Err.ToString());
- return false;
- }
- }
- Log4netHelper.Logger_Error.ErrorFormat("PLC未连接。");
- return false;
- }
- public bool ReadByteArea(ushort DBNumber, ushort start, ushort len, ref byte[] msg)
- {
- lock (olock)
- {
- try
- {
- if (_splc.Connected)
- {
- DataItem di = _splc.ReadArea(AreaType.DB, DBNumber, start, len, DataType.Byte);
- if (di != null && di.Err == ResultCode.OKFF)
- {
- msg = di.Data;
- return true;
- }
- else
- {
- if (di == null)
- {
- Log4netHelper.Logger_Error.ErrorFormat(string.Format("DB[{0}]读取失败,未查询到读取失败原因。", DBNumber));
- if (PlcErrorIsFull(DBNumber))
- {
- StopPlc();
- }
- }
- else
- Log4netHelper.Logger_Error.ErrorFormat(string.Format("DB[{0}]读取失败,原因:[{1}]", DBNumber, di.Err.ToString()));
- return false;
- }
- }
- else
- {
- LogMessageHelper.RecordLogMessage(string.Format("PLC[{0}]DB[{1}]读取失败,Connected为fasle,系统将重新连接plc。", _plc_name, DBNumber));
- }
- }
- catch (Exception ex)
- {
- Log4netHelper.Logger_Error.ErrorFormat(ex.ToString());
- }
- }
- return false;
- }
- private void PrintMsg(MessageEvent msg)
- {
- if (msg.Message.Trim() != "OK")
- {
- Log4netHelper.Logger_Info.Info(string.Format("PLC通信DLL消息:方法:[{0}]消息[{1}]", msg.Method, msg.Message));
- }
- }
- private bool PlcErrorIsFull(ushort dbnumber)
- {
- bool result = false;
- int count = 18;
- if (dbnumber == 520 || dbnumber == 521)
- {
- if (_plcErrorCount.ErrorCount == 0)
- {
- Log4netHelper.Logger_Error.ErrorFormat(string.Format("PLC[{0}]第一次报错,次数+1", _plc_name));
- _plcErrorCount.ErrorCount = 1;
- _plcErrorCount.LastTime = DateTime.Now;
- }
- else if (_plcErrorCount.ErrorCount < count)
- {
- if (_plcErrorCount.LastTime.AddSeconds(10) > DateTime.Now)
- {
- _plcErrorCount.ErrorCount += 1;
- _plcErrorCount.LastTime = DateTime.Now;
- Log4netHelper.Logger_Error.ErrorFormat(string.Format("PLC[{0}]次数+1 ,现有次数[{1}]", _plc_name, _plcErrorCount.ErrorCount));
- }
- else
- {
- _plcErrorCount.ErrorCount = 0;
- _plcErrorCount.LastTime = DateTime.Now;
- Log4netHelper.Logger_Error.ErrorFormat(string.Format("PLC[{0}]10秒未报错,次数重置", _plc_name, _plcErrorCount.ErrorCount));
- }
- }
- else if (_plcErrorCount.ErrorCount >= count)
- {
- _plcErrorCount.ErrorCount = 0;
- LogMessageHelper.RecordLogMessage(string.Format("PLC[{0}]读取DB频繁返回Null值达到[{1}]次,将停止PLC连接,次数清零,并重启PLC连接。", _plc_name, count));
- result = true;
- }
- }
- return result;
- }
- //public bool ReadWordArea(ushort DBNumber, ushort start, ushort len, ref byte[] msg)
- //{
- // if (_splc.Connected)
- // {
- // DataItem di = _splc.ReadArea(AreaType.DB, DBNumber, start, len, DataType.Word);
- // if (di != null && di.Err == ResultCode.OKFF)
- // {
- // msg = di.Data;
- // return true;
- // }
- // else
- // {
- // Current.Logger_Error.ErrorFormat(di.Err.ToString());
- // return false;
- // }
- // }
- // Current.Logger_Error.ErrorFormat("PLC未连接。");
- // return false;
- //}
- #endregion;
- #region 写入值
- public bool WriteSignal(ushort DBNumber, ushort start, ushort len, object msg)
- {
- lock (olock)
- {
- bool result = false;
- byte[] bt = new byte[len];
- if (len == 1)
- {
- bt[0] = Convert.ToByte(msg);
- }
- else if (len == 2)
- {
- byte[] from_wcs = System.BitConverter.GetBytes(Convert.ToUInt16(msg));
- bt[0] = from_wcs[1];//地位值
- bt[1] = from_wcs[0];//高位值
- }
- else if (len == 4)
- {
- byte[] from_wcs = System.BitConverter.GetBytes(Convert.ToUInt32(msg));
- bt[0] = from_wcs[3];
- bt[1] = from_wcs[2];
- bt[2] = from_wcs[1];
- bt[3] = from_wcs[0];
- }
- result = Write(DBNumber, start, bt);
- return result;
- }
- }
- public bool WriteBits(ushort DBNumber, uint start, bool status)
- {
- lock (olock)
- {
- bool result = false;
- if (_splc.Connected)
- {
- byte[] bt = new byte[1];
- bt[0] = Convert.ToByte(status);
- if (_splc.WriteArea(AreaType.DB, DBNumber, start, 1, DataType.Bit, bt))
- {
- result = true;
- }
- else
- {
- Log4netHelper.Logger_Error.ErrorFormat("写入DB信息失败,PLC可能未连接。(WriteBits)");
- }
- }
- else
- {
- Log4netHelper.Logger_Error.ErrorFormat("写入DB信息失败,PLC未连接。(WriteBits)");
- }
- return result;
- }
- }
- public bool Write(ushort DBNumber, ushort start, byte[] msg)
- {
- lock (olock)
- {
- bool result = false;
- if (_splc.Connected)
- {
- //DataType dt;
- //if (len == 1) dt = DataType.Byte;
- //else if (len == 2) dt = DataType.Word;
- //else if (len == 4) dt = DataType.DWord;
- //else return false;
- if (_splc.WriteArea(AreaType.DB, DBNumber, start, (ushort)msg.Length, DataType.Byte, msg))
- {
- result = true;
- }
- else
- {
- Log4netHelper.Logger_Error.ErrorFormat("写入DB信息失败,PLC可能未连接。(Write)");
- }
- }
- else
- {
- Log4netHelper.Logger_Error.ErrorFormat("写入DB信息失败,PLC未连接。(Write)");
- }
- return result;
- }
- }
- #endregion;
- public void PlcStop()
- {
- _splc.PlcStop();
- }
- public void RegisterStopPlcEvent(Action stopPlcAction)
- {
- if (stopPlcAction == null) throw new ArgumentNullException("stopPlcAction");
- StopPlcEvent = stopPlcAction;
- }
- private void StopPlc()
- {
- if (StopPlcEvent != null) StopPlcEvent.Invoke();
- }
- }
- public struct PlcErrorCount
- {
- public int ErrorCount;
- public DateTime LastTime;
- }
- }
|