コード例 #1
0
        public bool lambaDefualtJobState1StatusDefaultStateWrite(ModbusIpMaster master)
        {
            bool sonuc = false;

            try
            {
                ushort[] value = new ushort[4];
                value[0] = 4096; //device ID
                value[1] = 1;    //yazma
                value[2] = 6324; //reg. start
                value[3] = 2;    //adet
                master.WriteMultipleRegisters(1, 699, value);

                ushort[] value2 = new ushort[2];
                value2[0] = 2; //wait animationID
                value2[1] = 1; //wait color
                master.WriteMultipleRegisters(1, 703, value2);
            }
            catch (Exception)
            {
            }


            return(sonuc);
        }
コード例 #2
0
ファイル: drvCon.cs プロジェクト: Wolfury/ModbusTest
        //Установить ДТ
        public bool SetDT()
        {
            bool ret = false;

            try
            {
                dt[0] = ushort.Parse(System.DateTime.Now.Year.ToString());
                dt[1] = ushort.Parse(System.DateTime.Now.Month.ToString());
                dt[2] = ushort.Parse(System.DateTime.Now.Day.ToString());
                dt[3] = ushort.Parse(System.DateTime.Now.Hour.ToString());
                dt[4] = ushort.Parse(System.DateTime.Now.Minute.ToString());
                dt[5] = ushort.Parse(System.DateTime.Now.Second.ToString());
                dt[6] = (ushort)System.DateTime.Now.DayOfWeek;
                master.WriteMultipleRegisters(datetime_Addr, dt);

                ret = true;
            }
            catch
            {
                this.error_str = "Ошибка произошла при записи даты и время.";
                setError();
                //MessageBox.Show("Ошибка произошла при записи даты и время.");
            }
            finally
            { }
            return(ret);
        }
コード例 #3
0
        // job flash
        public bool lambaJobIlgiliIsikFlashYak(AutoResetEvent _AREvt, ushort DeviceID, ushort jobState1StatusAnimationID, ushort jobState1StatusColorID, ModbusIpMaster master)
        {
            bool sonuc = false;

            ushort[] sonucRegisterAdim0 = new ushort[7];
            ushort[] sonucRegisterAdim1 = new ushort[5];

            _AREvt = new AutoResetEvent(false);

            //start timer1, timer1.Interval = 1000 ms
            try
            {
                /*  ushort[] value = new ushort[4];
                 * value[0] = DeviceID;//device ID
                 * value[1] = 1;//yazma
                 * value[2] = 8701;//reg. start
                 * value[3] = 3;//adet
                 * master.WriteMultipleRegisters(1, 699, value);
                 *
                 * ushort[] value2 = new ushort[3];
                 * value2[0] = 1;//Job modu
                 * value2[1] = jobState1StatusAnimationID;//FLASH
                 * value2[2] = jobState1StatusColorID;//green
                 * master.WriteMultipleRegisters(1, 703, value2);*/

                ushort[] value = new ushort[6];

                value[0] = 1;                          //yazma
                value[1] = 8701;                       //reg. start
                value[2] = 3;                          //adet
                value[3] = 1;
                value[4] = jobState1StatusAnimationID; //adet
                value[5] = jobState1StatusColorID;     //adet
                master.WriteMultipleRegisters(1, 700, value);
                master.WriteSingleRegister(1, 699, DeviceID);
                _AREvt.WaitOne(300);


                ushort[] value3 = new ushort[4];
                value3[0] = DeviceID; //device ID
                value3[1] = 1;        //yazma
                value3[2] = 6336;     //reg. start
                value3[3] = 1;        //adet
                master.WriteMultipleRegisters(1, 699, value3);

                ushort[] value4 = new ushort[1];
                value4[0] = 1;//yellow
                master.WriteMultipleRegisters(1, 703, value4);

                sonuc = true;
            }
            catch
            {
                sonuc = false;
            }



            return(sonuc);
        }
コード例 #4
0
        ///////////////////////////////////////////////////////////////////

        public bool lambaDurumDollyBaslangic(AutoResetEvent _AREvt, ushort jobState1StatusAnimationID, ushort jobState1StatusColorID, ModbusIpMaster master)
        {
            bool sonuc = false;

            ushort[] sonucRegisterAdim0 = new ushort[7];
            ushort[] sonucRegisterAdim1 = new ushort[5];



            _AREvt = new AutoResetEvent(false);



            try
            {
                ushort[] value = new ushort[6];
                value[0] = 1;                          //yazma
                value[1] = 8701;                       //reg. start
                value[2] = 3;                          //adet
                value[3] = 0;                          //adet
                value[4] = jobState1StatusAnimationID; //adet
                value[5] = jobState1StatusColorID;     //adet
                master.WriteMultipleRegisters(1, 700, value);

                master.WriteSingleRegister(1, 699, 4096);


                /* ushort[] value2 = new ushort[3];
                 * value2[0] = 0;//wait state
                 * value2[1] = jobState1StatusAnimationID;//job state flash
                 * value2[2] = jobState1StatusColorID;////job state color 1 green
                 * master.WriteMultipleRegisters(1, 703, value2);*/

                _AREvt.WaitOne(300);


                ushort[] value3 = new ushort[4];
                value3[0] = 4096; //device ID
                value3[1] = 1;    //yazma
                value3[2] = 6336; //reg. start
                value3[3] = 1;    //adet
                master.WriteMultipleRegisters(1, 699, value3);

                ushort[] value4 = new ushort[1];
                value4[0] = 1;//green
                master.WriteMultipleRegisters(1, 703, value4);
                sonuc = true;
            }
            catch (Exception ex)
            {
                sonuc = false;
            }



            return(sonuc);
        }
コード例 #5
0
        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        public bool SendResetErrorsCommand()
        {
            PrintReadInputRegsiterContents("Before reset");

            MCUModbusMaster.WriteMultipleRegisters(MCUConstants.ACTUAL_MCU_WRITE_REGISTER_START_ADDRESS, new ushort[] { 0x0800, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 });

            PrintReadInputRegsiterContents("After reset");

            return(true);
        }
コード例 #6
0
        // job steady - yellow kontrol
        public bool lambaJobIlgiliIsikSteadyYakSariReworkKontrol(ushort DeviceID, ushort jobStateReworkAnimationID, ushort jobStateReworkColorID, ModbusIpMaster master)
        {
            bool sonuc = false;

            try
            {
                ushort[] value = new ushort[4];
                value[0] = DeviceID; //device ID
                value[1] = 0;        //okuma
                value[2] = 8701;     //
                value[3] = 3;        // adet

                master.WriteMultipleRegisters(1, 699, value);

                ushort[] value2 = new ushort[3];
                value2 = master.ReadHoldingRegisters(1, 713, 3);

                if (value2[0] == 1 && value2[1] == jobStateReworkAnimationID && value2[2] == jobStateReworkColorID)
                {
                    sonuc = true;
                }
                else
                {
                    sonuc = false;
                }
            }
            catch
            {
            }

            return(sonuc);
        }
コード例 #7
0
        public ushort arr2; // For test purpose

        public void WriteArray(ushort index, ushort[] data)
        {
            this.arr1 = data[0];
            this.arr1 = data[1];

            _master.WriteMultipleRegisters(index, data);

            BusActivityDetection?.Invoke(this, new LogEvent("Data(ushort array) have been written successfully to multiple registers"));
        }
コード例 #8
0
        public string WriteIoData(CT2.CIoNode node)
        {
            ushort len;

            if (node.CheckIfExistDO())
            {
                len = (ushort)((node.m_DO_AddrEnd + 1 - node.m_DO_AddrStart) * 8);
                if (len != node.m_DataDO.Count)
                {
                    return("ERR_illegalDataLength_DO");
                }
                try
                {
                    Thread.Sleep(5);
                    ushort addrStart = (ushort)(CT2.ECT2Coils.RegionDO + node.m_DO_AddrStart * 8);
                    master.WriteMultipleCoils(addrStart, node.m_DataDO.ToArray());
                }
                catch (Exception e)
                {
                    return(e.Message);
                }
            }
            if (node.CheckIfExistAO())
            {
                len = (ushort)((node.m_AO_AddrEnd + 1 - node.m_AO_AddrStart) / 2);
                if (len != node.m_DataAO.Count)
                {
                    return("ERR_illegalDataLength_DO");
                }
                try
                {
                    Thread.Sleep(5);
                    ushort addrStart = (ushort)(CT2.ECT2HoldReg.RegionAO + (node.m_AO_AddrStart - 200) / 2);
                    master.WriteMultipleRegisters(addrStart, node.m_DataAO.ToArray());
                }
                catch (Exception e)
                {
                    return(e.Message);
                }
            }
            return("NO_ERR");
        }
コード例 #9
0
        // job steady - yellow
        public bool lambaJobIlgiliIsikSteadyYakSariRework(AutoResetEvent _AREvt, ushort DeviceID, ushort jobStateReworkAnimationID, ushort jobStateReworkColorID, ModbusIpMaster master)
        {
            bool sonuc = false;

            _AREvt = new AutoResetEvent(false);
            try
            {
                ushort[] value = new ushort[6];

                value[0] = 1;                         //yazma
                value[1] = 8701;                      //reg. start
                value[2] = 3;                         //adet
                value[3] = 1;
                value[4] = jobStateReworkAnimationID; //adet
                value[5] = jobStateReworkColorID;     //adet
                master.WriteMultipleRegisters(1, 700, value);
                master.WriteSingleRegister(1, 699, DeviceID);



                _AREvt.WaitOne(300, true);

                ushort[] value3 = new ushort[4];
                value3[0] = DeviceID; //device ID
                value3[1] = 1;        //yazma
                value3[2] = 6336;     //reg. start
                value3[3] = 1;        //adet
                master.WriteMultipleRegisters(1, 699, value3);

                ushort[] value4 = new ushort[1];
                value4[0] = 2;//yellow
                master.WriteMultipleRegisters(1, 703, value4);
                sonuc = true;
            }
            catch
            {
            }

            return(sonuc);
        }
コード例 #10
0
        public override bool Configure_MCU(int startSpeedDPSAzimuth, int startSpeedDPSElevation, int homeTimeoutSecondsAzimuth, int homeTimeoutSecondsElevation)
        {
            int gearedSpeedAZ = ConversionHelper.DPSToSPS(startSpeedDPSAzimuth, MotorConstants.GEARING_RATIO_AZIMUTH);
            int gearedSpeedEL = ConversionHelper.DPSToSPS(startSpeedDPSElevation, MotorConstants.GEARING_RATIO_ELEVATION);

            if ((gearedSpeedAZ < 1) || (gearedSpeedEL < 1) || (homeTimeoutSecondsAzimuth < 0) || (homeTimeoutSecondsElevation < 0) ||
                (gearedSpeedAZ > 1000000) || (gearedSpeedEL > 1000000) || (homeTimeoutSecondsAzimuth > 300) || (homeTimeoutSecondsElevation > 300))
            {
                return(false);
            }
            ushort[] data = { 0x8400, 0x0000, (ushort)(gearedSpeedAZ >> 0x0010), (ushort)(gearedSpeedAZ & 0xFFFF), (ushort)homeTimeoutSecondsAzimuth,
                              0x0,       0x0,                               0x0,                              0x0,                                 0x0,
                              0x8400, 0x0000, (ushort)(gearedSpeedEL >> 0x0010), (ushort)(gearedSpeedEL & 0xFFFF), (ushort)homeTimeoutSecondsElevation,
                              0x0,       0x0,                               0x0,                              0x0, 0x0 };
            //set_multiple_registers( data,  1);
            MCUModbusMaster.WriteMultipleRegisters(MCUConstants.ACTUAL_MCU_WRITE_REGISTER_START_ADDRESS, data);
            return(true);
        }
コード例 #11
0
        //wait-job
        public bool waitJobStateChange(ushort state, ModbusIpMaster master)
        {
            bool sonuc = false;

            try
            {
                ushort[] value = new ushort[4];
                value[0] = 4096; //device ID
                value[1] = 1;    //yazma
                value[2] = 8701; //reg. start
                value[3] = 1;    //adet
                master.WriteMultipleRegisters(1, 699, value);

                ushort[] value2 = new ushort[1];
                value2[0] = state;//wait state
                master.WriteMultipleRegisters(1, 703, value2);
            }
            catch (Exception)
            {
            }

            return(sonuc);
        }
コード例 #12
0
 public bool WriteRegisters(int address, ushort[] values)
 {
     if (this.CheckConnection())
     {
         try {
             using TcpClient client = new TcpClient(this.IpAddress, this.Port);
             ModbusIpMaster master = ModbusIpMaster.CreateIp(client);
             if (this.SlaveAddress != 0)
             {
                 master.WriteMultipleRegisters(this.SlaveAddress, (ushort)address, values);
             }
             else
             {
                 master.WriteMultipleRegisters((ushort)address, values);
             }
             client.Close();
             master.Dispose();
             return(true);
         } catch {
             return(false);
         }
     }
     return(false);
 }
コード例 #13
0
ファイル: ModbusTCP.cs プロジェクト: lulzzz/SmartWorld
        public static void Write_MultipleRegisters(ushort write_register_addr, ushort[] register_data)
        {
            write_register_addr = _register_Address;
            register_data       = _register_Data;
            Start_MBServer();
            Start_MBCLient();
            ModbusSlave slave    = ModbusTcpSlave.CreateTcp(_slaveID, slaveTCP);
            var         listener = slave.ListenAsync();

            ModbusIpMaster master = ModbusIpMaster.CreateIp(masterTCP);

            master.WriteMultipleRegisters(write_register_addr, register_data);

            Stop_MBClient();
            Stop_MBServer();
        }
コード例 #14
0
        private void Run_PLC_emulator_thread()
        {
            while (runsimulator)
            {
                try {
                    PLCTCPClient    = new TcpClient(this.PLC_ip, this.PLC_port);
                    PLCModbusMaster = ModbusIpMaster.CreateIp(PLCTCPClient);
                } catch {//no server setup on control room yet
                    logger.Info(Utilities.GetTimeStamp() + ": ________________PLC sim awaiting control room");
                }
                logger.Info(Utilities.GetTimeStamp() + ": ________________PLC sim running");
                PLCModbusMaster.WriteMultipleRegisters((ushort)PLC_modbus_server_register_mapping.Gate_Safety_INTERLOCK, new ushort[] { BoolToInt(true) });
                while (runsimulator)
                {
                    if (isTest)
                    {
                        PLCModbusMaster.WriteMultipleRegisters((ushort)PLC_modbus_server_register_mapping.Gate_Safety_INTERLOCK, new ushort[] { BoolToInt(true) });
                        Thread.Sleep(5);
                        continue;
                    }
                    else
                    {
                        if (!EL0LimStatus)
                        {
                            if (currentEL < EL0Lim_ON)
                            {
                                EL0LimStatus = (currentEL < EL0Lim_ON);
                                PLCModbusMaster.WriteMultipleRegisters((ushort)PLC_modbus_server_register_mapping.EL_10_LIMIT, new ushort[] { BoolToInt(!EL0LimStatus) });
                            }
                        }
                        else if (currentEL > EL0Lim_OFF)
                        {
                            EL0LimStatus = (currentEL > EL0Lim_OFF);
                            PLCModbusMaster.WriteMultipleRegisters((ushort)PLC_modbus_server_register_mapping.EL_10_LIMIT, new ushort[] { BoolToInt(!EL0LimStatus) });
                        }

                        if (!EL90LimStatus)
                        {
                            if (currentEL > EL90Lim_ON)
                            {
                                EL90LimStatus = (currentEL > EL90Lim_ON);
                                PLCModbusMaster.WriteMultipleRegisters((ushort)PLC_modbus_server_register_mapping.EL_90_LIMIT, new ushort[] { BoolToInt(!EL90LimStatus) });
                            }
                        }
                        else if (currentEL < EL90Lim_OFF)
                        {
                            EL90LimStatus = (currentEL < EL90Lim_OFF);
                            PLCModbusMaster.WriteMultipleRegisters((ushort)PLC_modbus_server_register_mapping.EL_90_LIMIT, new ushort[] { BoolToInt(!EL90LimStatus) });
                        }
                    }
                    Thread.Sleep(50);
                }
            }
        }
コード例 #15
0
        public void WriteMultipleRegisters(byte slaveAddress, ushort startAddress, ushort[] data)
        {
            if (!status)
            {
                Connect();
            }

            try
            {
                master.WriteMultipleRegisters(slaveAddress, startAddress, data);
            }
            catch (Exception ex)
            {
                status = false;
                AddMessage("Catch exception in the function WriteMultipleRegisters(). " + ex.Message,
                           DebugLevel.ExceptionLevel);
            }
        }
コード例 #16
0
 private void Run_PLC_emulator_thread()
 {
     while (runsimulator)
     {
         try{
             PLCTCPClient    = new TcpClient(this.PLC_ip, this.PLC_port);
             PLCModbusMaster = ModbusIpMaster.CreateIp(PLCTCPClient);
         }
         catch {//no server setup on control room yet
             Console.WriteLine("________________PLC sim awaiting control room");
             Thread.Sleep(1000);
         }
         Console.WriteLine("________________PLC sim running");
         PLCModbusMaster.WriteMultipleRegisters((ushort)PLC_modbus_server_register_mapping.Safty_INTERLOCK - 1, new ushort[] { 1 });
         while (runsimulator)
         {
             Thread.Sleep(50);
         }
     }
 }
コード例 #17
0
ファイル: Program.cs プロジェクト: sulmar/ModbusSample
        private static void CommunicationTest()
        {
            TcpClient      client = new TcpClient("127.0.0.1", 502);
            ModbusIpMaster master = ModbusIpMaster.CreateIp(client);

            // read five input values
            ushort startAddress = 0;
            ushort numInputs    = 16;

            bool[] inputs = master.ReadCoils(startAddress, numInputs);


            // Odczyt cyfrowych
            var digitalInputs = master.ReadInputs(startAddress, 16);

            /// Odczyt analogowych
            var analogInputs = master.ReadInputRegisters(0, 16);

            var numbers = new ushort[] { 55, 66 };

            master.WriteMultipleRegisters(0, numbers);


            // Zapis
            master.WriteSingleCoil(18, true);



            // Zapis do Holding Registers
            master.WriteSingleRegister(1, 254);

            var holding = master.ReadHoldingRegisters(0, 2);

            var digitalInputs2 = master.ReadInputs(startAddress, 16);

            for (int i = 0; i < numInputs; i++)
            {
                Console.WriteLine("Input {0}={1}", startAddress + i, inputs[i] ? 1 : 0);
            }
        }
コード例 #18
0
        //job state 1. status
        public ushort[] lambaDefualtJobState1StatusRead(ModbusIpMaster master)
        {
            ushort[] value2 = new ushort[2];
            try
            {
                ushort[] value = new ushort[4];
                value[0] = 31;   //device ID
                value[1] = 0;    //okuma
                value[2] = 6324; //reg. start
                value[3] = 2;    //adet
                master.WriteMultipleRegisters(1, 699, value);



                value2 = master.ReadHoldingRegisters(1, 713, 2);
            }
            catch (Exception ex)
            {
            }

            return(value2);
        }
コード例 #19
0
        public void MotorControl(ushort Height, ushort RotationMode, ushort Spd, ushort Pos)
        {
            List <ushort> s = new List <ushort>(255);

            //r[0]:1=start/on execution,0=finished execution
            s.Add(1);
            //r[1]:left lifting motor height
            s.Add(Height);
            //r[2]:right lifting motor height
            s.Add(Height);
            //r[3]:Rotation Motor Mode:
            //0=clockwise step,1=counterclockwise step,
            //2=clockwise speed,3=counterclockwise speed
            s.Add(RotationMode);
            //r[4]:Rotation angle/speed
            s.Add(Spd);
            //r[5]:Translation motor positon
            s.Add(Pos);
            //r[6]:error alarm,0=normal
            s.Add(0);

            Mot.WriteMultipleRegisters(1, 0, s.ToArray());

            ushort[] receive;
            do
            {
                pMain.ct.ThrowIfCancellationRequested();

                Thread.Sleep(1000);
                receive = Mot.ReadHoldingRegisters(1, 0, 10);
                if (receive[6] != 0)
                {
                    throw new Exception("电机报警");
                }
            }while (receive[0] == 1);
        }
コード例 #20
0
        public void Paletleme(int maxHight, int reference_x, int reference_y, int paletX, int paletY, int paletZ, int productX, int productY, int productZ, int tolerans)
        {
            ushort gripperAdress = 1;                            //GRİPPER REGISTER ADRESİ ATANMALI !!!

            ushort[] gripperOffsets = new ushort[3];             //OFFSET DEĞERLERİ ATANMALI !!!
            ushort   gripperControl = 0;

            TcpClient      Client = new TcpClient();
            ModbusIpMaster master = ModbusIpMaster.CreateIp(Client);

            int calculateX, calculateY, calculateZ, AdjustedReferenceX, AdjustedReferenceY, AdjustedReferenceZ, initialX, initialY, initialZ;

            calculateZ         = maxHight / productZ;
            calculateY         = paletY / productY;
            AdjustedReferenceY = (paletY - calculateY * productY) / 2 + reference_y;
            calculateX         = paletY / productX;
            AdjustedReferenceX = (paletX - calculateX * productX) / 2 + reference_x;
            AdjustedReferenceZ = paletZ;
            initialX           = AdjustedReferenceX;
            initialY           = AdjustedReferenceY;
            initialZ           = AdjustedReferenceZ;

            ushort offsetX, offsetY, offsetZ;

            Client.Connect("192.168.0.1", 502);
            for (int k = 0; k < calculateZ; k++)
            {
                for (int j = 0; j < calculateY; j++)
                {
                    for (int i = 0; i < calculateX; i++)
                    {
                        offsetX = (ushort)(AdjustedReferenceX + productX / 2 + i * productX);
                        offsetY = (ushort)(AdjustedReferenceY + productY / 2);
                        offsetZ = (ushort)(AdjustedReferenceZ + productZ);

                        ushort   offsetAdress = 2;                     //OFFSET REGISTER ADRESİ ATANMALI !!!
                        ushort[] offsetValues = new ushort[3];
                        offsetValues[0] = offsetX;
                        offsetValues[1] = offsetY;
                        offsetValues[2] = offsetZ;
                        while (true)
                        {
                            master.ReadHoldingRegisters(gripperAdress, gripperControl);
                            if (gripperControl == 1)
                            {
                                master.WriteMultipleRegisters(offsetAdress, offsetValues);
                                break;
                            }
                        }
                        while (true)
                        {
                            master.ReadHoldingRegisters(gripperAdress, gripperControl);
                            if (gripperControl == 0)
                            {
                                master.WriteMultipleRegisters(offsetAdress, gripperOffsets);
                                break;
                            }
                        }
                    }
                    AdjustedReferenceX = initialX;
                    AdjustedReferenceY = AdjustedReferenceY + productY;
                }
                AdjustedReferenceX = initialX;
                AdjustedReferenceY = initialY;
                AdjustedReferenceZ = AdjustedReferenceZ + productZ;
            }
        }
コード例 #21
0
        private bool ResponseData(IO_SERVER server, IO_COMMUNICATION comm, IO_DEVICE device, IO_PARA para, string value)
        {
            if (para == null)
            {
                return(false);
            }
            if (para.IO_POINTTYPE == "计算值" || para.IO_POINTTYPE == "关系数据库值")
            {
                return(false);
            }
            //设备地址不能为空
            if (device.IO_DEVICE_ADDRESS == "")
            {
                return(false);
            }
            try
            {
                //通过设备驱动进行数据解析,并生成下置的数据bytes
                if (device.DeviceDrive != null)
                {
                    ScadaDeviceKernel Driver = (ScadaDeviceKernel)device.DeviceDrive;

                    //获取参数中的
                    if (udpClient != null && master != null)
                    {
                        ParaPack paraPack = new ParaPack(para.IO_PARASTRING);
                        if (paraPack.Count > 0)
                        {
                            ushort offset = ushort.Parse(paraPack.GetValue("偏置"));
                            switch (paraPack.GetValue("内存区"))
                            {
                            case "01":
                            {
                                if (ushort.Parse(value) > 0)
                                {
                                    master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, true);
                                }
                                else
                                {
                                    master.WriteSingleCoil(byte.Parse(device.IO_DEVICE_ADDRESS), offset, false);
                                }
                            }
                            break;

                            case "02":    //此类型只能查询,不能写入
                            {
                            }
                            break;

                            case "03":
                            {
                                Modbus_Type datatype     = (Modbus_Type)Enum.Parse(typeof(Modbus_Type), paraPack.GetValue("数据类型"));
                                bool        ishigh       = paraPack.GetValue("存储位置") == "高八位" ? true : false;
                                int         charsize     = int.Parse(paraPack.GetValue("字节长度"));
                                bool        isposition   = paraPack.GetValue("按位存取") == "1" ? true : false;
                                int         dataposition = int.Parse(paraPack.GetValue("数据位"));
                                switch (datatype)
                                {
                                case Modbus_Type.单精度浮点数32位:
                                {
                                    ushort[] buff       = new ushort[2];
                                    float    WriteValue = float.Parse(value);
                                    ModbusConvert.SetReal(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.双精度浮点数64位:
                                {
                                    ushort[] buff       = new ushort[4];
                                    double   WriteValue = double.Parse(value);
                                    ModbusConvert.SetDouble(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.字符型:
                                {
                                    ushort[] buff       = new ushort[charsize];
                                    string   WriteValue = value;
                                    if (value.Length > charsize)
                                    {
                                        WriteValue = value.Substring(0, charsize);
                                    }
                                    if (value.Length < charsize)
                                    {
                                        WriteValue = value.PadRight(charsize, ' ');
                                    }
                                    ModbusConvert.SetString(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.无符号整数8位:
                                {
                                    ushort[] buff       = new ushort[1];
                                    byte     WriteValue = byte.Parse(value);
                                    ModbusConvert.SetByte(buff, 0, WriteValue, ishigh);
                                    master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                }
                                break;

                                case Modbus_Type.符号整数8位:
                                {
                                    ushort[] buff       = new ushort[1];
                                    sbyte    WriteValue = sbyte.Parse(value);
                                    ModbusConvert.SetSByte(buff, 0, WriteValue, ishigh);
                                    master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                }
                                break;

                                case Modbus_Type.无符号整数16位:
                                {
                                    if (isposition)
                                    {
                                        //获取当前寄存器的值
                                        ushort[] datas     = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1);
                                        ushort   dataValue = ModbusConvert.GetUShort(datas, 0);

                                        if (short.Parse(value) > 0)
                                        {
                                            dataValue = Convert.ToUInt16(dataValue >> dataposition & 1);
                                        }
                                        else
                                        {
                                            dataValue = Convert.ToUInt16(dataValue >> dataposition & 0);
                                        }
                                        //新发送的值

                                        ushort[] datas2 = new ushort[1];
                                        ModbusConvert.SetUShort(datas2, 0, dataValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]);
                                    }
                                    else
                                    {
                                        ushort   WriteValue = ushort.Parse(value);
                                        ushort[] buff       = new ushort[1];
                                        ModbusConvert.SetUShort(buff, 0, WriteValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                    }
                                }
                                break;

                                case Modbus_Type.符号整数16位:
                                {
                                    if (isposition)
                                    {
                                        //获取当前寄存器的值
                                        ushort[] datas     = master.ReadHoldingRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, 1);
                                        short    dataValue = ModbusConvert.GetShort(datas, 0);

                                        if (short.Parse(value) > 0)
                                        {
                                            dataValue = Convert.ToInt16(dataValue >> dataposition & 1);
                                        }
                                        else
                                        {
                                            dataValue = Convert.ToInt16(dataValue >> dataposition & 0);
                                        }
                                        //新发送的值

                                        ushort[] datas2 = new ushort[1];
                                        ModbusConvert.SetShort(datas2, 0, dataValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, datas2[0]);
                                    }
                                    else
                                    {
                                        Int16    WriteValue = Int16.Parse(value);
                                        ushort[] buff       = new ushort[1];
                                        ModbusConvert.SetShort(buff, 0, WriteValue);
                                        master.WriteSingleRegister(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff[0]);
                                    }
                                }
                                break;

                                case Modbus_Type.无符号整数32位:
                                {
                                    uint     WriteValue = uint.Parse(value);
                                    ushort[] buff       = new ushort[2];
                                    ModbusConvert.SetUInt(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;

                                case Modbus_Type.符号整数32位:
                                {
                                    int      WriteValue = int.Parse(value);
                                    ushort[] buff       = new ushort[2];
                                    ModbusConvert.SetInt(buff, 0, WriteValue);
                                    master.WriteMultipleRegisters(byte.Parse(device.IO_DEVICE_ADDRESS), offset, buff);
                                }
                                break;
                                }
                            }
                            break;
                            }
                        }
                    }
                }
            }
            catch
            {
                return(false);
            }
            return(true);
        }
コード例 #22
0
        public unsafe void UpdateFHPP()
        {
            //Mapping of all FHPP Data to signals. See Manual for more information (https://www.festo.com/net/en-ca_ca/SupportPortal/Downloads/385511/403818/555696g1.pdf)

            //FHPP IN


            ModbusIpMaster master = ModbusIpMaster.CreateIp(client);


            ushort[] FHPP_IN = master.ReadHoldingRegisters(0, 4);

            DriveEnabled         = GetBit(FHPP_IN[0], 8);
            Ready                = GetBit(FHPP_IN[0], 9);;
            Warning              = GetBit(FHPP_IN[0], 10);;
            Fault                = GetBit(FHPP_IN[0], 11);;
            SupplyVoltagePresent = GetBit(FHPP_IN[0], 12);
            ControlFCT_HMI       = GetBit(FHPP_IN[0], 13);
            OperationModeB1      = GetBit(FHPP_IN[0], 14);
            OperationModeB2      = GetBit(FHPP_IN[0], 15);
            HaltActive           = GetBit(FHPP_IN[0], 0);
            AckStart             = GetBit(FHPP_IN[0], 1);
            MotionComplete       = GetBit(FHPP_IN[0], 2);
            DriveIsMoving        = GetBit(FHPP_IN[0], 4);
            DragError            = GetBit(FHPP_IN[0], 5);
            StandstillControl    = GetBit(FHPP_IN[0], 6);
            DriveIsReferenced    = GetBit(FHPP_IN[0], 7);
            ControlModeB1        = GetBit(FHPP_IN[1], 9);
            ControlModeB2        = GetBit(FHPP_IN[1], 10);

            if (!OperationModeB1 && !OperationModeB2)
            {
                StateOPM = 0;
            }
            else if (OperationModeB1 && !OperationModeB2 && !ControlModeB1 && !ControlModeB2)
            {
                StateOPM = 1;
            }
            else if (OperationModeB1 && !OperationModeB2 && !ControlModeB1 && ControlModeB2)
            {
                StateOPM = 5;
            }
            else if (OperationModeB1 && !OperationModeB2 && ControlModeB1 && !ControlModeB2)
            {
                StateOPM = 9;
            }


            byte[] ActualPositionHigh  = BitConverter.GetBytes(FHPP_IN[2]);
            byte[] ActualPositionLow   = BitConverter.GetBytes(FHPP_IN[3]);
            byte[] ActualPositionInt32 = new byte[4];

            ActualPositionInt32[1] = ActualPositionLow[1];
            ActualPositionInt32[0] = ActualPositionLow[0];
            ActualPositionInt32[3] = ActualPositionHigh[1];
            ActualPositionInt32[2] = ActualPositionHigh[0];

            ActualPosition = BitConverter.ToInt32(ActualPositionInt32, 0);

            byte[] ActualByte = BitConverter.GetBytes(FHPP_IN[1]);


            if (StateOPM == 0)
            {
                ActualRecordNumber = ActualByte[1];
                RC1   = GetBit(FHPP_IN[1], 8);
                RCC   = GetBit(FHPP_IN[1], 9);
                FNUM1 = GetBit(FHPP_IN[1], 11);
                FNUM2 = GetBit(FHPP_IN[1], 12);
                FUNC  = GetBit(FHPP_IN[1], 15);
            }
            else if (StateOPM == 5)
            {
                ActualForce = ActualByte[0];
            }
            else if (StateOPM == 1)
            {
                ActualVelocity = ActualByte[0];
            }


            //FHPP OUT



            byte[] FHPP_3_Array = new byte[2];



            FHPP_OUT[1] = SetValueVelocity;

            if (OPM == 0)
            {
                FHPP_OUT[0]     = SetBit(FHPP_OUT[0], 15, false);
                FHPP_OUT[0]     = SetBit(FHPP_OUT[0], 16, false);
                FHPP_3_Array[1] = RecordNumber;
                FHPP_OUT[1]     = BitConverter.ToUInt16(FHPP_3_Array, 0);
            }
            else if (OPM == 1)
            {
                FHPP_OUT[0]     = SetBit(FHPP_OUT[0], 15, true);
                FHPP_OUT[0]     = SetBit(FHPP_OUT[0], 16, false);
                FHPP_OUT[1]     = SetBit(FHPP_OUT[1], 10, false);
                FHPP_OUT[1]     = SetBit(FHPP_OUT[1], 11, false);
                FHPP_3_Array[0] = SetValueVelocity;
                FHPP_3_Array[1] = 0;
                FHPP_OUT[1]     = SetValueVelocity;

                byte[] SetPositionBytes = BitConverter.GetBytes(SetValuePosition);
                FHPP_OUT[3] = BitConverter.ToUInt16(SetPositionBytes, 0);
                FHPP_OUT[2] = BitConverter.ToUInt16(SetPositionBytes, 2);
            }
            else if (OPM == 5)
            {
                FHPP_OUT[0] = SetBit(FHPP_OUT[0], 15, true);
                FHPP_OUT[0] = SetBit(FHPP_OUT[0], 16, false);
                FHPP_OUT[1] = SetBit(FHPP_OUT[1], 10, true);
                FHPP_OUT[1] = SetBit(FHPP_OUT[1], 11, false);

                FHPP_OUT[3] = SetValueForce;
                FHPP_OUT[2] = 0;
            }
            else if (OPM == 6)
            {
                FHPP_OUT[0] = SetBit(FHPP_OUT[0], 15, true);
                FHPP_OUT[0] = SetBit(FHPP_OUT[0], 16, false);
                FHPP_OUT[1] = SetBit(FHPP_OUT[1], 10, false);
                FHPP_OUT[1] = SetBit(FHPP_OUT[1], 11, true);
            }



            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 9, EnableDrive);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 10, Stop);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 11, Brake);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 12, ResetFault);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 14, HMIAccessLocked);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 1, Halt);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 2, StartTask);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 3, StartHoming);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 4, JogPos);
            FHPP_OUT[0] = SetBit(FHPP_OUT[0], 5, JogNeg);



            try
            {
                master.WriteMultipleRegisters(0, FHPP_OUT);
            }
            catch (Modbus.SlaveException e)
            {
                System.Console.WriteLine(e.Message);
                if (e.SlaveExceptionCode == 1)
                {
                    throw new Modbus.SlaveException("Exception 1 (Illegal Function): The function code received in the query is not an allowable action for the slave.  This may be because the function code is only applicable to newer devices, and was not implemented in the unit selected.");
                }
                else if (e.SlaveExceptionCode == 2)
                {
                    throw new Modbus.SlaveException("Exception 2 (Illegal Data Address): The data address received in the query is not an allowable address for the slave. More specifically, the combination of reference number and transfer length is invalid.");
                }
                else if (e.SlaveExceptionCode == 3)
                {
                    throw new Modbus.SlaveException("Exception 3 (Illegal Data Value): A value contained in the query data field is not an allowable value for server (or slave). This indicates a fault in the structure of remainder of a complex request, such as that the implied length is incorrect");
                }
                else if (e.SlaveExceptionCode == 4)
                {
                    throw new Modbus.SlaveException("Exception 4 (Slave Device Failure): An unrecoverable error occurred while the slave was attempting to perform the requested action.");
                }
            }
        }
コード例 #23
0
        void cleanQuery()
        {
            // вначале разбираем очередь на запись
            writeComm wr;

            // создание дубликата writeQuveryDuble и освобождение исходной коллеции
            List <writeComm> writeQuveryDuble = new List <writeComm>();

            lock (block)
            {
                for (int i = 0; i < writeQuvery.Count; i++)
                {
                    writeQuveryDuble.Add(writeQuvery[i]);
                }
                writeQuvery.Clear();
            } //lock

            try
            {
                for (int i = 0; i < writeQuveryDuble.Count; i++)
                {
                    wr = writeQuveryDuble[i];
                    if (wr.reg == 0)
                    {
                        if (wr.len == 1)
                        {
                            master.WriteSingleCoil(wr.address, (bool)wr.value);
                        }
                        else
                        {
                            bool[] b = (bool[])wr.value;
                            master.WriteMultipleCoils(wr.address, b);
                        }
                    }
                    if (wr.reg == 3)
                    {
                        if (wr.type == 2 || wr.type == 3) //2 байтный int
                        {
                            if (wr.len == 1)
                            {
                                master.WriteSingleRegister(wr.address, BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 0));
                            }
                            else
                            {
                                ushort[] b = (ushort[])wr.value;
                                master.WriteMultipleRegisters(wr.address, b);
                            }
                        }
                        if (wr.type >= 4 && wr.type <= 7) //4 байтный int
                        {
                            if (wr.len == 1)
                            {
                                ushort[] b = new ushort[2];
                                b[0] = BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 0);
                                b[1] = BitConverter.ToUInt16(BitConverter.GetBytes((int)wr.value), 2);
                                master.WriteMultipleRegisters(wr.address, b);
                            }
                            else
                            {
                                int[] b = (int[])wr.value;
                                for (ushort j = 0; j < wr.len; j++)
                                {
                                    ushort[] bb = new ushort[2];
                                    bb[0] = BitConverter.ToUInt16(BitConverter.GetBytes(b[j]), 0);
                                    bb[1] = BitConverter.ToUInt16(BitConverter.GetBytes(b[j]), 2);
                                    master.WriteMultipleRegisters((ushort)(wr.address + (j * 2)), bb);
                                }
                            }
                        }
                        if (wr.type >= 8 && wr.type <= 9) //4 байтный float
                        {
                            if (wr.len == 1)
                            {
                                byte[]   b  = BitConverter.GetBytes((float)wr.value);
                                ushort[] bb = new ushort[2];
                                bb[0] = BitConverter.ToUInt16(b, 0);
                                bb[1] = BitConverter.ToUInt16(b, 2);
                                master.WriteMultipleRegisters(wr.address, bb);
                            }
                            else
                            {
                                float[] bb = (float[])wr.value;
                                for (int j = 0; j < wr.len; j++)
                                {
                                    byte[]   b   = BitConverter.GetBytes(bb[j]);
                                    ushort[] bbb = new ushort[2];
                                    bbb[0] = BitConverter.ToUInt16(b, 0);
                                    bbb[1] = BitConverter.ToUInt16(b, 2);
                                    master.WriteMultipleRegisters((ushort)(wr.address + (j * 2)), bbb);
                                }
                            }
                        } //if
                    }     //if
                }         //for
            }
            catch (Exception err)
            {
                Util.errorTCP();
                Util.errorMessage(err.Message, description);
                device.status = err.HResult;
                device.ready  = false; //??????????????????????????????/
            }
            //writeQuvery.Clear();
        }
コード例 #24
0
ファイル: ModbusTCP.cs プロジェクト: cuongjpitdnu/Project
        //public void Charge(int sensorId)
        //{
        //    try
        //    {
        //        if (modbusMst == null) return;

        //        /*modbusMst.WriteMultipleRegisters(1, 0x0002, new ushort[] { 0x0008 }); // relay ON
        //        Thread.Sleep(80); //wait 0.8s
        //        modbusMst.WriteMultipleRegisters(0x0003, new ushort[] { 0 }); // reset 0V
        //        modbusMst.WriteMultipleRegisters(0, 0x0002, new ushort[] { 0x0008 }); // relay OFF
        //        modbusMst.WriteMultipleRegisters(2, new ushort[] { 1, 0x0001, 1 }); // charge
        //        Thread.Sleep(100);
        //        modbusMst.WriteMultipleRegisters(2, new ushort[] { 1, 0x0001, 0 }); // charge*/

        //        /*modbusMst.WriteMultipleRegisters(0x0002, new ushort[] { (ushort)sensorId }); // select sensor
        //        //modbusMst.WriteMultipleRegisters(0x0001, new ushort[] { (ushort)sensorId });
        //        modbusMst.WriteMultipleRegisters(0x0003, new ushort[] { 1, 1 }); // charge
        //        Thread.Sleep(100);
        //        modbusMst.WriteMultipleRegisters(0x0003, new ushort[] { 0 }); // charge */

        //    }
        //    catch (Exception ex)
        //    {
        //        if (ErrorsReceiveDataFromBlock != null)
        //        {
        //            ErrorsReceiveDataFromBlock(this, new DSF602Exception(ex.Message, ex.InnerException, DSF602ExceptionStatusCode.Connect));
        //        }
        //    }
        //}

        public void SelectSensor(ushort sensorId)
        {
            Thread.Sleep(800);

            if (modbusMst != null)
            {
                //modbusMst.WriteMultipleRegisters(0x0006, new ushort[] { 1 });
                //Thread.Sleep(800);
                //modbusMst.WriteMultipleRegisters(0x0006, new ushort[] { 0 });
                //Thread.Sleep(100);
                modbusMst.WriteMultipleRegisters(0x0002, new ushort[] { sensorId });
                Thread.Sleep(100);
            }
        }
コード例 #25
0
        public async void sensorOkuma(ushort deviceID)
        {
            //start timer1, timer1.Interval = 1000 ms
            try
            {
                if (NetworkIsOk)
                {
                    #region Master to Slave
                    //read AI, AO, DI, DO

                    value[0] = deviceID; //device ID
                    value[1] = 0;        //okuma
                    value[2] = 7942;     //başlangıç register
                    value[3] = 1;        // adet

                    master.WriteMultipleRegisters(1, 699, value);

                    sensor = master.ReadHoldingRegisters(1, 713, 1);
                    if (sensor[0] > 0)
                    {
                        cGenel.sensorSonucu = sensor[0];
                        error_kayit.error_log_kayit("sensör aktif");
                    }

                    //cGenel.CommonDeviceID = sensor[0];
                    #endregion
                }
                else
                {
                    // cGenel.sensorSonucu = 0;
                    //retry connecting
                    dtNow = DateTime.Now;
                    if ((dtNow - dtDisconnect) > TimeSpan.FromSeconds(10))
                    {
                        cGenel.haberlesmeMesaj = (DateTime.Now.ToString() + ":DXM Start connecting");
                        error_kayit.error_log_kayit(cGenel.haberlesmeMesaj);
                        NetworkIsOk = await ConnectTask();

                        if (!NetworkIsOk)
                        {
                            cGenel.haberlesmeMesaj = (DateTime.Now.ToString() + ":DXM Connecting fail. Wait for retry");
                            error_kayit.error_log_kayit(cGenel.haberlesmeMesaj);
                            dtDisconnect = DateTime.Now;
                        }
                    }
                    else
                    {
                        cGenel.haberlesmeMesaj = (DateTime.Now.ToString() + ":DXM Wait for retry connecting");
                        error_kayit.error_log_kayit(cGenel.haberlesmeMesaj);
                    }
                }
            }
            catch (Exception ex)
            {
                if (ex.Source.Equals("DXM System"))
                {
                    //set NetworkIsOk to false and retry connecting
                    NetworkIsOk            = false;
                    cGenel.haberlesmeMesaj = (ex.Message);
                    error_kayit.error_log_kayit(cGenel.haberlesmeMesaj);
                    dtDisconnect = DateTime.Now;
                }
            }
        }