示例#1
0
        private void DataStoreReadFrom(object sender, DataStoreEventArgs e)
        {
            switch (e.ModbusDataType)
            {
            case ModbusDataType.Coil:
                // Read CoilDiscretes values
                // add code here
                break;

            case ModbusDataType.Input:
                // Read InputDiscretes values
                // add code here
                break;

            case ModbusDataType.InputRegister:
                // Read InputRegisters values
                // add code here
                break;

            case ModbusDataType.HoldingRegister:
                // Read HoldingRegisters values
                // add code here
                break;
            }

            if (lblMessage.Text != "Comms Okay")
            {
                lblMessage.Invoke((MethodInvoker) delegate { lblMessage.Text = "Comms Okay"; });
            }
        }
示例#2
0
    internal static DataStoreEventArgs CreateDataStoreEventArgs <T>(ushort startAddress, ModbusDataType modbusDataType, IEnumerable <T> data)
    {
        if (data == null)
        {
            throw new ArgumentNullException(nameof(data));
        }

        DataStoreEventArgs eventArgs;

        if (typeof(T) == typeof(bool))
        {
            ReadOnlyCollection <bool>?a = new(data.Cast <bool>().ToArray());

            eventArgs = new DataStoreEventArgs(startAddress, modbusDataType)
            {
                Data = DiscriminatedUnion <ReadOnlyCollection <bool>, ReadOnlyCollection <ushort> > .CreateA(a)
            };
        }
        else if (typeof(T) == typeof(ushort))
        {
            ReadOnlyCollection <ushort>?b = new(data.Cast <ushort>().ToArray());

            eventArgs = new DataStoreEventArgs(startAddress, modbusDataType)
            {
                Data = DiscriminatedUnion <ReadOnlyCollection <bool>, ReadOnlyCollection <ushort> > .CreateB(b)
            };
        }
        else
        {
            throw new ArgumentException("Generic type T should be of type bool or ushort");
        }

        return(eventArgs);
    }
        public void CreateDataStoreEventArgs()
        {
            var eventArgs = DataStoreEventArgs.CreateDataStoreEventArgs(5, ModbusDataType.HoldingRegister, new ushort[] { 1, 2, 3 });

            Assert.AreEqual(ModbusDataType.HoldingRegister, eventArgs.ModbusDataType);
            Assert.AreEqual(5, eventArgs.StartAddress);
            Assert.AreEqual(new ushort[] { 1, 2, 3 }, eventArgs.Data.B.ToArray());
        }
 private void Server_Written_to_handler(object sender, DataStoreEventArgs e)
 {
     MCU_Modbusserver.DataStore.HoldingRegisters[1] = (ushort)(MCU_Modbusserver.DataStore.HoldingRegisters[1] & 0xff7f);
     //Console.WriteLine("plcdriver data writen 1 reg "+ e.Data.B[0]+" start adr "+ e.StartAddress);
     ushort[] data = new ushort[e.Data.B.Count];
     for (int i = 0; i < e.Data.B.Count; i++)
     {
         data[i] = e.Data.B[i];
     }
     handleCMD(data);
 }
示例#5
0
        private void Server_Written_to_handler(object sender, DataStoreEventArgs e)
        {
            MCU_Modbusserver.DataStore.HoldingRegisters[1]  = (ushort)(MCU_Modbusserver.DataStore.HoldingRegisters[1] & 0xff7f);
            MCU_Modbusserver.DataStore.HoldingRegisters[11] = (ushort)(MCU_Modbusserver.DataStore.HoldingRegisters[11] & 0xff7f);

            ushort[] data = new ushort[20];//e.Data.B.Count
            if (e.StartAddress >= 1023)
            {
                data = Copy_modbus_registers(1025, 20);
                handleTestCMD(data);
            }
        }
示例#6
0
        /// <summary>
        /// fires whenever the data on the modbus server changes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Server_Written_to_handler(object sender, DataStoreEventArgs e)
        {
            //e.Data.B //array representing data

            switch (e.StartAddress) //
            {
            case (ushort)PLC_modbus_server_register_mapping.CMD_ACK: {
                // Console.WriteLine(" data {0} written to 22",PLC_Modbusserver.DataStore.HoldingRegisters[e.StartAddress]);
                try {
                    //comand_acknoledged.Release();
                } catch (Exception err) {
                    Console.WriteLine(err);
                }
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.AZ_LEFT_LIMIT: {
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.AZ_LEFT_WARNING: {
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.AZ_RIGHT_WARNING: {
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.AZ_RIGHT_LIMIT: {
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_BOTTOM_LIMIT: {
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_BOTTOM_WARNING: {
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_TOP_WARNING: {
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_TOP_LIMIT: {
                break;
            }
            }
        }
示例#7
0
 private static void DataStore_DataStoreReadFrom(object sender, DataStoreEventArgs e)
 {
     {
         if (e.ModbusDataType == ModbusDataType.HoldingRegister)
         {
             Console.WriteLine($"\nClient reads {e.ModbusDataType} address {e.StartAddress + 40001} - read {e.Data.B[0]}");
             Console.Write("> ");
         }
         else
         {
             Console.WriteLine($"\nClient reads {e.ModbusDataType} address {e.StartAddress + 1} - read {e.Data.A[0]}");
             Console.Write("> ");
         }
     }
 }
示例#8
0
        private void DataStore_DataStoreWrittenTo(object sender, DataStoreEventArgs e)
        {
            if (e.ModbusDataType != ModbusDataType.HoldingRegister) return;

            var data = (DataStore)sender;
            var newValue = data.HoldingRegisters[e.StartAddress + 1];

            modifiedRegister = new Register()
            {
                Address = e.StartAddress,
                Value = newValue
            };

            Debugger.Log(1, "Debug", modifiedRegister.Value + " | " + newValue);
            context.Post((a) => ValueWasWritten?.Invoke(null, modifiedRegister), null);
        }
示例#9
0
 private void DataStore_DataStoreWrittenTo(object sender, DataStoreEventArgs e)
 {
     if (e != null && e.Data != null)
     {
         try
         {
             if (e.Data.Option == Modbus.Utility.DiscriminatedUnionOption.B)
             {
                 LogText($"Written to addr {e.StartAddress} : {e.Data.B[0]}");
             }
             else
             {
                 LogText($"Written to addr {e.StartAddress} : {e.Data.A[0]}");
             }
         }
         catch (Exception ex)
         {
             LogText($"Excpetion {ex.Message}");
         }
     }
 }
示例#10
0
        private void DataStoreWriteTo(object sender, DataStoreEventArgs e)
        {
            int address = e.StartAddress;

            switch (e.ModbusDataType)
            {
            case ModbusDataType.Coil:
                // Write CoilDiscretes values
                for (int i = 0; i <= e.Data.A.Count - 1; i++)
                {
                    if (e.Data.A[i])
                    {
                        UpdateCD(1, address, "1");
                    }
                    else
                    {
                        UpdateCD(1, address, "0");
                    }

                    address += 1;
                }

                break;

            case ModbusDataType.HoldingRegister:
                // Write HoldingRegisters values
                for (int i = 0; i <= e.Data.B.Count - 1; i++)
                {
                    UpdateHR(1, address, e.Data.B[i].ToString());
                    address += 1;
                }

                break;
            }

            if (lblMessage.Text != "Comms Okay")
            {
                lblMessage.Invoke((MethodInvoker) delegate { lblMessage.Text = "Comms Okay"; });
            }
        }
示例#11
0
        private static void Modbus_DataStoreWriteTo(object sender, DataStoreEventArgs e)
        {
            int number = 0;

            int Address = e.StartAddress;//e.StartAddress;

            switch (e.ModbusDataType)
            {
            case ModbusDataType.HoldingRegister:
                SetInputStatus(68, false);
                Console.WriteLine("Holding Register");
                Console.WriteLine("address: " + Address.ToString());
                Console.WriteLine("length frame: " + e.Data.B.Count.ToString());
                Console.Write("data: ");
                for (int i = 1; i <= e.Data.B.Count; i++)
                {
                    Console.Write(ModbusProtocol.GetDataHoldingRegister(Address + i) + ",");
                }
                Console.WriteLine();
                ViewModel.VisualizationViewModel.HideMessage();

                if (Address == 0)
                {
                    if (GetDataCoils(15) == true)
                    {
                        ViewModel.VisualizationViewModel.TurnpikePutDown(SetSpeedTurnpike());
                    }
                    else if (GetDataCoils(15) == false)
                    {
                        ViewModel.VisualizationViewModel.TurnpikePutUp(SetSpeedTurnpike());
                    }
                }


                break;

            case ModbusDataType.Coil:

                Console.WriteLine("Coil");
                Console.WriteLine("address: " + Address.ToString());
                Console.WriteLine("length frame: " + e.Data.A.Count.ToString());
                Console.Write("data: ");

                for (int i = 0; i < e.Data.A.Count; i++)
                {
                    Console.Write(ModbusProtocol.GetDataCoils(Address + i + 1) + ",");
                    number++;
                }

                ViewModel.VisualizationViewModel.HideMessage();
                SetInputStatus(68, false);

                Answers(Address);
                CheckAvaliableDeparture();
                SetAvaliableTrack1();
                SetAvaliableTrack2();

                Console.WriteLine("avaliable track: {0}", availableTrack);
                Console.WriteLine("avaliable track2: {0}", availableTrack2);
                Console.WriteLine("avaliable departure track: {0}", avaliableDeparture);
                Console.WriteLine();

                break;
            }
        }
示例#12
0
 public void CreateDataStoreEventArgs_DataNull()
 {
     var eventArgs = DataStoreEventArgs.CreateDataStoreEventArgs(5, ModbusDataType.HoldingRegister, default(ushort[]));
 }
示例#13
0
 public void CreateDataStoreEventArgs_InvalidType()
 {
     var eventArgs = DataStoreEventArgs.CreateDataStoreEventArgs(5, ModbusDataType.HoldingRegister, new int[] { 1, 2, 3 });
 }
示例#14
0
        /// <summary>
        /// fires whenever the data on the modbus server changes
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Server_Written_to_handler(object sender, DataStoreEventArgs e)
        {
            //e.Data.B //array representing data
            if (is_test)
            {
                logger.Info(Utilities.GetTimeStamp() + ": recived message from PLC");
            }
            PLC_last_contact = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
            switch (e.StartAddress)
            {
            case (ushort)PLC_modbus_server_register_mapping.AZ_0_LIMIT: {
                bool previous = limitSwitchData.Azimuth_CCW_Limit;
                limitSwitchData.Azimuth_CCW_Limit = !Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.AZ_0_LIMIT]);
                if (previous != limitSwitchData.Azimuth_CCW_Limit)
                {
                    pLCEvents.PLCLimitChanged(limitSwitchData, PLC_modbus_server_register_mapping.AZ_0_LIMIT, limitSwitchData.Azimuth_CCW_Limit);
                }
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.AZ_0_HOME: {
                bool previous = homeSensorData.Azimuth_Home_One;
                homeSensorData.Azimuth_Home_One = Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.AZ_0_HOME]);
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.AZ_0_SECONDARY: {
                bool previous = homeSensorData.Azimuth_Home_Two;
                homeSensorData.Azimuth_Home_Two = Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.AZ_0_SECONDARY]);
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.AZ_375_LIMIT: {
                bool previous = limitSwitchData.Azimuth_CW_Limit;
                limitSwitchData.Azimuth_CW_Limit = !Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.AZ_375_LIMIT]);
                if (previous != limitSwitchData.Azimuth_CW_Limit)
                {
                    pLCEvents.PLCLimitChanged(limitSwitchData, PLC_modbus_server_register_mapping.AZ_375_LIMIT, limitSwitchData.Azimuth_CW_Limit);
                }
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_10_LIMIT: {
                bool previous = limitSwitchData.Elevation_Lower_Limit;
                limitSwitchData.Elevation_Lower_Limit = !Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.EL_10_LIMIT]);
                if (previous != limitSwitchData.Elevation_Lower_Limit)
                {
                    pLCEvents.PLCLimitChanged(limitSwitchData, PLC_modbus_server_register_mapping.EL_10_LIMIT, limitSwitchData.Elevation_Lower_Limit);
                    if (limitSwitchData.Elevation_Lower_Limit)
                    {
                        logger.Info(Utilities.GetTimeStamp() + ": Elevation Lower Limit Switch Hit");

                        pushNotification.sendToAllAdmins("LIMIT SWITCH", "Elevation lower limit switch hit");
                        EmailNotifications.sendToAllAdmins("LIMIT SWITCH", "Elevation lower limit switch hit");
                    }
                }
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_0_HOME: {
                bool previous = homeSensorData.Elevation_Home;
                homeSensorData.Elevation_Home = Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.EL_0_HOME]);
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_90_LIMIT: {
                bool previous = limitSwitchData.Elevation_Upper_Limit;
                limitSwitchData.Elevation_Upper_Limit = !Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.EL_90_LIMIT]);
                if (previous != limitSwitchData.Elevation_Upper_Limit)
                {
                    pLCEvents.PLCLimitChanged(limitSwitchData, PLC_modbus_server_register_mapping.EL_90_LIMIT, limitSwitchData.Elevation_Upper_Limit);
                    if (limitSwitchData.Elevation_Upper_Limit)
                    {
                        logger.Info(Utilities.GetTimeStamp() + ": Elevation Upper Limit Switch Hit");

                        pushNotification.sendToAllAdmins("LIMIT SWITCH", "Elevation upper limit switch hit");
                        EmailNotifications.sendToAllAdmins("LIMIT SWITCH", "Elevation upper limit switch hit");
                    }
                }
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.Gate_Safety_INTERLOCK: {
                bool previous = plcInput.Gate_Sensor;
                plcInput.Gate_Sensor = !Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.Gate_Safety_INTERLOCK]);
                if (previous != plcInput.Gate_Sensor)
                {
                    if (plcInput.Gate_Sensor)
                    {
                        logger.Info(Utilities.GetTimeStamp() + ": gate opened");

                        pushNotification.sendToAllAdmins("GATE ACTIVITY", "Gate has been opened.");
                        EmailNotifications.sendToAllAdmins("GATE ACTIVITY", "Gate has been opened.");
                    }
                    else
                    {
                        logger.Info(Utilities.GetTimeStamp() + ": gate closed");

                        pushNotification.sendToAllAdmins("GATE ACTIVITY", "Gate has been closed.");
                        EmailNotifications.sendToAllAdmins("GATE ACTIVITY", "Gate has been closed.");
                    }
                }
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.E_STOP: {
                bool previous = plcInput.Estop;
                plcInput.Estop = !Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.E_STOP]);
                if (previous != plcInput.Estop)
                {
                    if (plcInput.Estop)
                    {
                        logger.Info(Utilities.GetTimeStamp() + ": Estop Hit");

                        pushNotification.sendToAllAdmins("E-STOP ACTIVITY", "E-stop has been hit.");
                        EmailNotifications.sendToAllAdmins("E-STOP ACTIVITY", "E-stop has been hit.");
                    }
                    else
                    {
                        logger.Info(Utilities.GetTimeStamp() + ": Estop released");

                        pushNotification.sendToAllAdmins("E-STOP ACTIVITY", "E-stop has been released.");
                        EmailNotifications.sendToAllAdmins("E-STOP ACTIVITY", "E-stop has been released.");
                    }
                }
                break;
            }

            case (ushort)PLC_modbus_server_register_mapping.EL_SLIP_CAPTURE: {
                bool previous = plcInput.EL_Slip_CAPTURE;
                plcInput.EL_Slip_CAPTURE = Int_to_bool(PLC_Modbusserver.DataStore.HoldingRegisters[(int)PLC_modbus_server_register_mapping.EL_SLIP_CAPTURE]);
                break;
            }
            }
        }
 void DataStore_DataStoreWrittenTo(object sender, DataStoreEventArgs e)
 {
     switch (e.ModbusDataType)
     {
         case ModbusDataType.HoldingRegister:
             for (int i = 0; i < e.Data.B.Count; i++)
             {
                 //Set AO
                 //e.Data.B[i] already write to
                 var tmp = regValues.Where(x => x.Register == e.StartAddress + i + 1);
                 tmp.ElementAt(0).Value = slave.DataStore.HoldingRegisters[e.StartAddress + i + 1];
                 //e.StartAddress starts from 0
                 //You can set AO value to hardware here
             }
             break;
         case ModbusDataType.Coil:
             break;
     }
 }
 public void CreateDataStoreEventArgs_InvalidType() =>
 Assert.Throws <ArgumentException>(() => DataStoreEventArgs.CreateDataStoreEventArgs(5, ModbusDataType.HoldingRegister,
                                                                                     new int[] { 1, 2, 3 }));
 public void CreateDataStoreEventArgs_DataNull() =>
 Assert.Throws <ArgumentNullException>(() =>
                                       DataStoreEventArgs.CreateDataStoreEventArgs(5, ModbusDataType.HoldingRegister, default(ushort[])));
示例#18
0
 private static void DataStore_DataStoreWrittenTo(object sender, DataStoreEventArgs e)
 {
     Console.WriteLine($"\nClient writes {e.ModbusDataType} address {e.StartAddress + 1} - write {e.Data.A[0]}");
     Console.Write("> ");
 }