Raspberry PI, Mono, IToolS: Application 1 Un’applicazione di esempio che mostra l’integrazione tra il framework MONO, il framework IToolS su single-board Raspberry PI. In particolare l’applicazione ha l’obiettivo di intercettare una stringa dalla porta seriale lunga 10 caratteri e rifletterla su modbus slave tcp, per implementare il sistema si e’ utilizzato il driver IToolS SerialFrameReader ed il ModnetSlave:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
using System; using System.Collections.Generic; using System.Text; using IToolS.Lite; using IToolS.Lite.Communication; using IToolS.Lite.IOServers; using IToolS.Data; using IToolS.Data.Base; using IToolSSerialFrameReader; namespace TestSerialFrameReader { class Program { static void Main(string[] args) { IOServer m_ioServer1 = new IOServer(); Client m_client1 = new Client(); Group m_group1 = new Group(); Variable m_variable1 = new Variable(); m_variable1.Area = SerialFrameReader.FRAME_AREA; m_variable1.Address = SerialFrameReader.FRAME_VARIABLE_ADDRESS; m_variable1.VariableType = SerialFrameReader.FRAMESTRING_DATATYPE; m_ioServer1.Name = SerialFrameReader.IOSERVER_NAME; m_ioServer1.AdvancedProperties.Add(new AdvancedProperty("FrameLength", 10)); m_ioServer1.AdvancedProperties.Add(new AdvancedProperty("FrameTerminator", IToolSSerialFrameReader.FrameTerminator.LengthTerminator)); m_ioServer1.SerialConfig.PortName = "/dev/ttyAMA0"; m_ioServer1.SerialConfig.BaudRate = 115200; m_ioServer1.SerialConfig.DataBits = 8; m_ioServer1.SerialConfig.StopBits = IToolS.Data.Serial.StopBits.One; m_ioServer1.SerialConfig.Parity = IToolS.Data.Serial.Parity.None; m_group1.Items.Add(m_variable1); m_client1.IOServer = m_ioServer1; m_client1.Group = m_group1; IOServer m_ioServer2 = new IOServer(); Client m_client2 = new Client(); Group m_group2 = new Group(); Variable m_variable2 = new Variable(); m_variable2.VariableName = "variable2"; m_variable2.Area = "HR"; m_variable2.Address = "10"; m_variable2.VariableType = VariableTypeConverter.String; m_ioServer2.Name = "ModnetSlave"; m_group2.Items.Add(m_variable2); m_client2.IOServer = m_ioServer2; m_client2.Group = m_group2; m_variable1.Changed += delegate(object sender, ChangedEventArgs e) { Console.WriteLine("Serial value: {0}", e.NewValue); m_variable2.Value = Convert.ToString(e.NewValue).Substring(0, 6); }; m_client1.Start(); m_client2.Start(); Console.WriteLine("Press ENTER to exit"); Console.ReadLine(); m_client1.Stop(); m_client1.StopIOServer(); m_client2.Stop(); m_client2.StopIOServer(); Console.WriteLine("Bye bye"); } } } |
L’esempio e’ composto da un’ulteriore applicazione che funge da simulatore, ovvero genera ad intervalli regolari una stringa casuale lunga 10 caratteri:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
using System; using System.Collections.Generic; using System.IO.Ports; using System.Text; using System.Threading; using IToolS.Base; namespace SerialFrameSimulator { class Program { static void Main(string[] args) { SerialPort serialPort = new SerialPort(); serialPort.PortName = "COM2"; serialPort.BaudRate = 115200; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Parity = Parity.None; Thread thread = new Thread(delegate() { while (true) { try { if (!serialPort.IsOpen) serialPort.Open(); serialPort.Write(Utilities.RandomString(10, true)); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { Thread.Sleep(5000); } } }); thread.IsBackground = true; thread.Start(); Console.WriteLine("Press ENTER to exit"); Console.ReadLine(); serialPort.Close(); Console.WriteLine("Bye bye"); } } } |