private void FormMain_Load(object sender, EventArgs e) { try { txtResult.AppendText("FATEK PLC COMMUNICATION PROTOCOL VIA SERIALPORT\r\n"); txtResult.AppendText("===============================================================\r\n"); txtResult.AppendText(string.Format("1. Port Name: COM5 \r\n")); txtResult.AppendText(string.Format("2. BaudRate: 9600 \r\n")); txtResult.AppendText(string.Format("3. Parity: Even \r\n")); txtResult.AppendText(string.Format("4. DataBits: 7 \r\n")); txtResult.AppendText(string.Format("5. StopBits: One \r\n")); txtResult.AppendText("===============================================================\r\n"); txtResult.AppendText("Designed By Industrial Networks\r\n"); txtResult.AppendText("Skype: katllu\r\n"); txtResult.AppendText("Mobile: (+84) 909.886.483\r\n"); txtResult.AppendText("E-mail: [email protected]\r\n"); txtResult.AppendText("Youtube: https://www.youtube.com/industrialnetworks \r\n"); txtResult.AppendText(Environment.NewLine); objFatekCommunication = new FatekCommunication("COM5", 9600, Parity.Even, 7, StopBits.One); objFatekCommunication.Connect(); } catch (Exception ex) { MessageBox.Show(this, ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
public void Connect() { try { IsConnected = true; Console.WriteLine("STARTED: {0}", ++COUNTER); taskArray = new Task[Channels.Count]; if (taskArray == null) { throw new NullReferenceException("No Data"); } for (var i = 0; i < Channels.Count; i++) { taskArray[i] = new Task(chParam => { FatekCommunication modbus = null; var ch = (Channel)chParam; modbus = mbe[ch.ChannelName]; modbus.Connect(); IsConnected = modbus.IsConnected; while (IsConnected) { foreach (var dv in ch.Devices) { foreach (var db in dv.DataBlocks) { if (!IsConnected) { break; } SendPackage(modbus, dv, db); } } } }, Channels[i]); taskArray[i].Start(); } } catch (Exception ex) { var err = new HMIException.ScadaException(this.GetType().Name, ex.Message); IsConnected = false; } }
public void InitializeService(Channel ch) { try { Channels.Add(ch); if (Channels == null) { return; } FatekCommunication modbus = null; switch (ch.ConnectionType) { case "SerialPort": var dis = (DISerialPort)ch; var sp = new SerialPort(dis.PortName, dis.BaudRate, dis.Parity, dis.DataBits, dis.StopBits); sp.Handshake = dis.Handshake; modbus = new FatekCommunication(sp); mbe.Add(ch.ChannelName, (FatekCommunication)modbus); break; } foreach (var dv in ch.Devices) { foreach (var db in dv.DataBlocks) { foreach (var tg in db.Tags) { TagCollection.Tags.Add( $"{ch.ChannelName}.{dv.DeviceName}.{db.DataBlockName}.{tg.TagName}", tg); } } } } catch (Exception ex) { var err = new HMIException.ScadaException(this.GetType().Name, ex.Message); } }
/// <summary> /// This constructor takes the COM number and baude rate and adds Parity bit and number of bit values and calls Fatek core constructor /// </summary> /// <param name="COMno"></param> /// <param name="baudRate"></param> public FatekPLCInterface(string COMno, int baudRate) { _comNumber = COMno; objFatekCommunication = new FatekCommunication(COMNumber, baudRate, Parity.Even, 7, StopBits.One); objFatekCommunication.Connect(); }
public FormWriteToRegisters(FatekCommunication fatekCommunication) { InitializeComponent(); objFatekCommunication = fatekCommunication; }
private void SendPackage(FatekCommunication modbus, Device dv, DataBlock db) { try { SendDone.WaitOne(-1); DataType dataType = (DataType)Enum.Parse(typeof(DataType), db.DataType); MemoryType memoryType = (MemoryType)Enum.Parse(typeof(MemoryType), db.MemoryType); switch (db.DataType) { case "BOOL": bool[] BitRs = null; switch (db.TypeOfRead) { case "ReadCoilStatus": BitRs = modbus.ReadDiscretes((byte)dv.SlaveId, db.Length, memoryType, db.StartAddress, dataType); break; case "ReadInputStatus": // bitArys = modbus.ReadInputStatus((byte)dv.SlaveId, $"{db.StartAddress}", //db.Length); break; default: break; } if (BitRs.Length > db.Tags.Count) { return; } for (var j = 0; j < db.Tags.Count; j++) { db.Tags[j].Value = BitRs[j]; db.Tags[j].Checked = BitRs[j]; db.Tags[j].Enabled = BitRs[j]; db.Tags[j].Visible = BitRs[j]; db.Tags[j].ValueSelect1 = BitRs[j]; db.Tags[j].ValueSelect2 = BitRs[j]; db.Tags[j].Timestamp = DateTime.Now; } break; case "INT": case "DINT": case "WORD": case "DWORD": case "REAL": object[] wdArys = null; switch (db.TypeOfRead) { case "ReadHoldingRegisters": wdArys = modbus.ReadRegisters((byte)dv.SlaveId, db.Length, memoryType, db.StartAddress, dataType); break; case "ReadInputRegisters": //wdArys = modbus.ReadInputRegisters((byte)dv.SlaveId, $"{db.StartAddress}", db.Length); break; default: break; } if (wdArys.Length > db.Tags.Count) { return; } for (var j = 0; j < wdArys.Length; j++) { db.Tags[j].Value = wdArys[j]; db.Tags[j].Timestamp = DateTime.Now; } break; } } catch (Exception ex) { IsConnected = false; var err = new HMIException.ScadaException(this.GetType().Name + " XFATEK.SendPackage", ex.Message); } }
public void WriteTag(string TagName, dynamic Value) { SendDone.Reset(); try { var strArrays = TagName.Split('.'); var str = $"{strArrays[0]}.{strArrays[1]}.{strArrays[2]}"; foreach (var ch in Channels) { foreach (var dv in ch.Devices) { foreach (var db in dv.DataBlocks) { var bEquals = $"{ch.ChannelName}.{dv.DeviceName}.{db.DataBlockName}".Equals(str); if (bEquals) { FatekCommunication modbusMaster = null; modbusMaster = mbe[ch.ChannelName]; var bmodbus = modbusMaster == null; if (bmodbus) { return; } var obj = modbusMaster; DataType dataType = (DataType)Enum.Parse(typeof(DataType), TagCollection.Tags[TagName].DataType); MemoryType memoryType = (MemoryType)Enum.Parse(typeof(MemoryType), db.MemoryType); lock (obj) { switch (TagCollection.Tags[TagName].DataType) { case "BOOL": if (Value == "1") { modbusMaster.WriteSingleDiscrete((byte)dv.SlaveId, CommandCode.SINGLE_DISCRETE_CONTROL, RunningCode.Set, memoryType, ushort.Parse(TagCollection.Tags[TagName].Address), dataType); } else { modbusMaster.WriteSingleDiscrete((byte)dv.SlaveId, CommandCode.SINGLE_DISCRETE_CONTROL, RunningCode.Reset, memoryType, ushort.Parse(TagCollection.Tags[TagName].Address), dataType); } break; case "INT": case "DINT": case "WORD": case "DWORD": case "REAL": { string[] DataAsArray = { Value }; var dataPacket = new List <object>(); var x = new byte[2]; for (var i = 0; i < DataAsArray.Length; i++) { x = BitConverter.GetBytes(Convert.ToInt16(DataAsArray[i])); dataPacket.Add(x[1]); dataPacket.Add(x[0]); } modbusMaster.WriteMultipeRegisters((byte)dv.SlaveId, 1, memoryType, ushort.Parse(TagCollection.Tags[TagName].Address), dataType, dataPacket.ToArray()); break; } } } } } } } } catch (Exception ex) { var err = new HMIException.ScadaException(this.GetType().Name + " XModbus.WriteTag", ex.Message); } finally { SendDone.Set(); } }