using MewtocolNet; using MewtocolNet.Logging; using MewtocolNet.Registers; namespace Examples.BasicRegisterReadWrite; internal class Program { const string PLC_IP = "192.168.178.55"; static void Main(string[] args) => Task.Run(AsyncMain).Wait(); static async Task AsyncMain() { Console.Clear(); //the library provides a logging tool, comment this out if needed Logger.LogLevel = LogLevel.Critical; //here we collect our built registers IRegister simpleNumberRegister = null!; IRegister simpleNumberRegister2 = null!; IRegister simpleWordRegister = null!; IArrayRegister overlapWordRegister = null!; IStringRegister stringRegister = null!; IArrayRegister stringArrayRegister = null!; IArrayRegister2D simpleNumberRegister2Dim = null!; //create a new interface to the plc using ethernet / tcp ip using var plc = Mewtocol.Ethernet(PLC_IP) .WithRegisters(b => { //a simple INT at register address DT1000 b.Struct("DT1000").Build(out simpleNumberRegister); b.Struct("DT1001").Build(out simpleNumberRegister2); //you can also read the same array as an other data type //not how they are at the same address, that means their values are linked b.Struct("DT1000").Build(out simpleWordRegister); //same link feature is also true for arrays that overlap their addresses //this will go from DT999 to DT1001 because its a 3 Word array b.Struct("DT999").AsArray(3).Build(out overlapWordRegister); //strings area not stacially sized, they use a different constructor b.String("DT1024", 32).Build(out stringRegister); //string can also be arrayed b.String("DT2030", 5).AsArray(3).Build(out stringArrayRegister); //a simple 2 dimensional ARRAY [0..2, 0..2] OF INT at DT2003 b.Struct("DT2003").AsArray(3, 3).Build(out simpleNumberRegister2Dim); }) .Build(); //you can explain the internal register layout and which ones are linked by Console.WriteLine(plc.Explain()); //connect async to the plc await plc.ConnectAsync(); //check if the connection was established if (!plc.IsConnected) { Console.WriteLine("Failed to connect to the plc..."); Environment.Exit(1); } //restarts the program, this will make sure the global registers of the plc get reset each run await plc.RestartProgramAsync(); //from this point on we can modify our registers //read the value of the the register short readValue = await simpleNumberRegister.ReadAsync(); ushort readValue2 = await simpleNumberRegister2.ReadAsync(); //show the value Console.WriteLine($"Read value for {nameof(simpleNumberRegister)}: {readValue}"); Console.WriteLine($"Read value for {nameof(simpleNumberRegister2)}: {readValue2}"); //write the value await simpleNumberRegister.WriteAsync(30); //show the value Console.WriteLine($"Value of {nameof(simpleNumberRegister)}: {simpleNumberRegister.Value}"); //because the two registers at DT1000 are linked by their memory address in the plc, //both of their values got updated Console.WriteLine($"Value of {nameof(simpleWordRegister)}: {simpleWordRegister.Value}"); //also the overlapping word array register value got updated, but only at the DT positions that were read int i = 0; overlapWordRegister.Value.ToList().ForEach(x => { Console.WriteLine($"Value of {nameof(overlapWordRegister)}[{i}]: {x}"); i++; }); //you can even read out a word bitwise Console.WriteLine($"Bits of {nameof(simpleWordRegister)}: {simpleWordRegister.Value?.ToStringBits()}"); //or as a single bit Console.WriteLine($"Bit at index 3 of {nameof(simpleWordRegister)}: {simpleWordRegister.Value?[3]}"); //reading / writing the string register //await stringRegister.WriteAsync("Lorem ipsum dolor sit amet, cons"); await stringRegister.ReadAsync(); Console.WriteLine($"Value of {nameof(stringRegister)}: {stringRegister.Value}"); //reading writing a string array register await stringArrayRegister.ReadAsync(); i = 0; stringArrayRegister.Value.ToList().ForEach(x => { Console.WriteLine($"Value of {nameof(stringArrayRegister)}[{i}]: {x}"); i++; }); //you can either set the whole array at once, //this will be slow if you only want to update one item await stringArrayRegister.WriteAsync(new string[] { "Test1", "Test2", "Test3", }); //or update just one //COMING LATER //same thing also works for 2 dim arrays await simpleNumberRegister2Dim.ReadAsync(); //the array is multi dimensional but can also be iterated per element foreach (var item in simpleNumberRegister2Dim) Console.WriteLine($"Element of {nameof(simpleNumberRegister2Dim)}: {item}"); //you can also use the array indexer accessors Console.WriteLine($"Element [1, 2] of {nameof(simpleNumberRegister2Dim)}: {simpleNumberRegister2Dim[1, 2]}"); } }