Exemple modbus pour modules adam, beckhoff, wago

Description

une petite source qui m'a fait défaut.

on y trouve une interface permettant de dialoquer avec module
ADAM (6066 et 6052),
Beckhoff BK9050 (+2 carte 8 Entrées et 1 carte 8 sorties)
Wago 750-842 (+2 carte 8 Entrées et 1 carte 8 sorties)

pour la dll, j'ai repris une partie d'un modbus disponible sur le net et un peu modifié

Source / Exemple :


using System;
using System.Collections;
using System.Text;
using System.ComponentModel;
using System.IO;
using System.Threading;
using System.Windows.Forms;

namespace DLL_Mbus
{
    public partial class ModbusIO : Component
    {
        #region Enum Module Type
        public enum IOModuleType
        {
            AUCUN,
            ADAM,
            WAGO,
            BECKHOFF
        }
        # endregion

        #region Var
        private ModbusTCP.Master modbus = null;
        private bool m_bStart;
        private string m_szIP;
        private int m_iPort;
        private IOModuleType type = IOModuleType.AUCUN;

        public int m_iDoTotal = 16;
        private int m_iDiTotal = 64;
        private int m_iDiStart = 0;
        private int m_iDoStart = 512;

        bool[] bDoWData = new bool[16];

        private Thread myRunThread;

        public bool modbusConnected = false;

        public bool[] inputs = new bool[64];

        public bool[] outputs = new bool[16];

        private enum Status
        {
            receivedata,
            sendData,
            rsetWD
        }

        private Status status = Status.receivedata;
        #endregion

        #region Constructeur
        public ModbusIO()
        {
            InitializeComponent();
        }

        public ModbusIO(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }
        #endregion

        #region Init Comm
        public bool InitComm(string ipmodule,IOModuleType Modtype) // TODO Mettre IP et TYPE en param
        {
            m_bStart = false;			// the action stops at the beginning
            m_szIP = ipmodule;	// modbus slave IP address
            m_iPort = 502;				// modbus TCP port is 502
            modbus = new ModbusTCP.Master();
            this.type = Modtype;

    //Initialisation des variables en fonction du type de module
            
            switch(Modtype)
            {   
                case IOModuleType.ADAM:
                    m_iDoTotal = 16;
                    m_iDiTotal = 64;
                    m_iDiStart = 0;
                    m_iDoStart = 16;
                    m_szIP=ipmodule;
                break;
                case IOModuleType.WAGO:
                    m_iDoTotal = 16;
                    m_iDiTotal = 64;
                    m_iDiStart = 0;
                    m_iDoStart = 512;
                    m_szIP = ipmodule;
                break;
                case IOModuleType.BECKHOFF:
                    m_iDoTotal = 16;
                    m_iDiTotal = 64;
                    m_iDiStart = 0;
                    m_iDoStart = 2048;
                    m_szIP = ipmodule;
                break;
            }

            if (m_bStart) // was started
            {
                m_bStart = false;		// starting flag
                //timer1.Enabled = false; // disable timer
                modbus.disconnect(); // disconnect slave
                //this.lblStatus.Text = "Disconnected";
            }
            else	// was stopped
            {
                if (modbus.connect(m_szIP, (ushort) m_iPort))
                {
                    // m_iCount = 0; // reset the reading counter

                    //timer1.Enabled = true; // enable timer
                    //this.lblStatus.Text = "Connected";
                    m_bStart = true; // starting flag
                }
                else
                    MessageBox.Show("Connection to IO Module failed", "Error");
            }

            if (this.m_bStart)
            {                                
                this.myRunThread = new Thread(new ThreadStart(run1));

                this.myRunThread.Start();
            }

            this.status = Status.rsetWD;

            return this.m_bStart;
        }
        #endregion
               
        #region Disconnect

        public void Disconnect()
        {
            if (this.myRunThread!=null)
                this.myRunThread.Abort();
            if (this.modbus != null)
            {
                this.modbus.disconnect();
                this.modbus = null;
            }
        }
        #endregion

        #region Dispose
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }

            if (this.myRunThread != null)
                this.myRunThread.Abort();

            base.Dispose(disposing);
        }
        #endregion

        #region Run Thread
        public void run1()
        {
            for (; ; )
            {
                switch (this.type)
                {
                    #region Case Wago/Beckoff
                    case IOModuleType.WAGO:
                    case IOModuleType.BECKHOFF:
                        switch (this.status)
                        {
                            case Status.receivedata:

                                #region LectureInVarModbus()

                                byte[] inDatas = new byte[m_iDiTotal];
                                modbus.ReadHoldingRegister(3, (ushort)m_iDiStart, (ushort)m_iDiTotal, ref inDatas);
                                
                                if (inDatas != null)
                                {
                                    BitArray bitArrayIN = new BitArray(inDatas);
                                    bool[] bitsIN = new bool[bitArrayIN.Count];
                                    bitArrayIN.CopyTo(bitsIN, 0);

                                    for (int i = 0; i < this.inputs.Length; i++)
                                    {
                                        this.inputs[i] = bitsIN[i];
                                    }
                                }

                                #endregion

                                #region LectureOutVarModbus()

                                byte[] outDatas = new byte[m_iDoTotal];
                                modbus.ReadHoldingRegister(3, (ushort)m_iDoStart, (ushort)m_iDoTotal, ref outDatas);
                               
                                if (outDatas != null)
                                {
                                    BitArray bitArrayOUT = new BitArray(outDatas);
                                    bool[] bitsOUT = new bool[bitArrayOUT.Count];
                                    bitArrayOUT.CopyTo(bitsOUT, 0);
                                    
                                    for (int i = 0; i < this.outputs.Length; i++)
                                    {
                                        this.outputs[i] = bitsOUT[i];
                                    }
                                }

                                #endregion

                            break;
                            case Status.rsetWD:

                                #region ResetWD()
                                byte[] byteout2 = new byte[120];
                                this.modbus.WriteRsetWd(ref byteout2);

                                this.status = Status.receivedata;
                                #endregion

                                break;
                            case Status.sendData:

                                #region EcritureOutVarModbus()
                                byte[] byteout = new byte[2];
                                byteout[1] = 0;

                                for (int i = 0; i < bDoWData.Length; i++)
                                {
                                    Byte b = Convert.ToByte(bDoWData[i]);
                                    byteout[1] += (byte)(b * (Math.Pow(2, i)));
                                }
                                byte[] byteresult = new byte[2];

                                modbus.WriteSingleRegister(200, (ushort)m_iDoStart, byteout, ref byteresult);
                                
                                this.status = Status.receivedata;
                                #endregion

                            break;
                            default:

                                #region LectureInVarModbus()

                                inDatas = new byte[m_iDiTotal];
                                
                                modbus.ReadHoldingRegister(3, (ushort)m_iDiStart, (ushort)m_iDiTotal, ref inDatas);
                                if (inDatas != null)
                                {
                                    BitArray bitArrayIN = new BitArray(inDatas);
                                    bool[] bitsIN = new bool[bitArrayIN.Count];
                                    bitArrayIN.CopyTo(bitsIN, 0);

                                    for (int i = 0; i < this.inputs.Length; i++)
                                    {
                                        this.inputs[i] = bitsIN[i];
                                    }
                                }

                                #endregion

                                #region LectureOutVarModbus()

                                outDatas = new byte[m_iDoTotal];
                                modbus.ReadHoldingRegister(3, (ushort)m_iDoStart, (ushort)m_iDoTotal, ref outDatas);
                                
                                if (outDatas != null)
                                {
                                    BitArray bitArrayOUT = new BitArray(outDatas);
                                    bool[] bitsOUT = new bool[bitArrayOUT.Count];
                                    bitArrayOUT.CopyTo(bitsOUT, 0);

                                    for (int i = 0; i < this.outputs.Length; i++)
                                    {
                                        this.outputs[i] = bitsOUT[i];
                                    }
                                }

                                #endregion

                            break;
                        }
                        break;
                    #endregion

                    #region Case ADAM
                    case IOModuleType.ADAM:
                        switch (this.status)
                        {
                            case Status.receivedata:

                                #region LectureInVarModbus()

                                byte[] inDatas = new byte[m_iDiTotal];
                                modbus.ReadDiscreteInputs(2, (ushort)m_iDiStart, (ushort)m_iDiTotal, ref inDatas);

                                if (inDatas != null)
                                {
                                    BitArray bitArrayIN = new BitArray(inDatas);
                                    bool[] bitsIN = new bool[bitArrayIN.Count];
                                    bitArrayIN.CopyTo(bitsIN, 0);

                                    for (int i = 0; i < this.inputs.Length; i++)
                                    {
                                        this.inputs[i] = bitsIN[i];
                                    }
                                }

                                #endregion

                                #region LectureOutVarModbus()

                                byte[] outDatas = new byte[m_iDoTotal];
                                modbus.ReadCoils(1, (ushort)m_iDoStart, (ushort)m_iDoTotal, ref outDatas);

                                if (outDatas != null)
                                {
                                    BitArray bitArrayOUT = new BitArray(outDatas);
                                    bool[] bitsOUT = new bool[bitArrayOUT.Count];
                                    bitArrayOUT.CopyTo(bitsOUT, 0);

                                    for (int i = 0; i < this.outputs.Length; i++)
                                    {
                                        this.outputs[i] = bitsOUT[i];
                                    }
                                }

                                #endregion

                                break;
                            case Status.rsetWD:

                                #region ResetWD()
                                
                                this.status = Status.receivedata;
                                #endregion

                                break;
                            case Status.sendData:

                                #region EcritureOutVarModbus()
                                byte[] byteout = new byte[2];
                                byteout[1] = 0;
                                byte[] byteresult = new byte[2];

                                for (int i = 0; i < bDoWData.Length; i++)
                                {
                                    modbus.WriteSingleCoils(5, (ushort)((m_iDoStart) + i), bDoWData[i], ref byteresult);
                                }

                                this.status = Status.receivedata;
                                break;
                                #endregion

                                break;
                            default:

                                #region LectureInVarModbus()

                                inDatas = new byte[m_iDiTotal];
                                modbus.ReadDiscreteInputs(2, (ushort)m_iDiStart, (ushort)m_iDiTotal, ref inDatas);

                                if (inDatas != null)
                                {
                                    BitArray bitArrayIN = new BitArray(inDatas);
                                    bool[] bitsIN = new bool[bitArrayIN.Count];
                                    bitArrayIN.CopyTo(bitsIN, 0);

                                    for (int i = 0; i < this.inputs.Length; i++)
                                    {
                                        this.inputs[i] = bitsIN[i];
                                    }
                                }

                                #endregion

                                #region LectureOutVarModbus()

                                outDatas = new byte[m_iDoTotal];
                                modbus.ReadCoils(1, (ushort)m_iDoStart, (ushort)m_iDoTotal, ref outDatas);

                                if (outDatas != null)
                                {
                                    BitArray bitArrayOUT = new BitArray(outDatas);
                                    bool[] bitsOUT = new bool[bitArrayOUT.Count];
                                    bitArrayOUT.CopyTo(bitsOUT, 0);

                                    for (int i = 0; i < this.outputs.Length; i++)
                                    {
                                        this.outputs[i] = bitsOUT[i];
                                    }
                                }

                                #endregion

                                break;
                        }
                        break;
                    #endregion
                }
                Thread.Sleep(20);
            }

        }
        #endregion

        #region EcritureOutVarModbus()

        public void EcritureOutVarModbus(bool[] outs)
        {
            switch (this.type)
            {
                case IOModuleType.ADAM:

                    for (int i = 0; i < this.outputs.Length; i++)
                    {

                        if (this.outputs[i] != outs[i])
                            this.bDoWData[i] = outs[i];

                    }
                    this.status = Status.sendData;
                    break;
                case IOModuleType.WAGO:                    
                case IOModuleType.BECKHOFF:
                    BitArray bitArrayOUT = new BitArray(outputs);
                    bool[] outputs2 = new bool[bitArrayOUT.Count];
                    Array.Copy(outputs, 0, outputs2, 8, 8);
                    Array.Copy(outputs, 8, outputs2, 0, 8);

                    for (int i = 0; i < outputs2.Length; i++)
                    {

                        if (outputs2[i] != outs[i])
                            this.bDoWData[i] = outs[i];

                    }
                    this.status = Status.sendData;
                    break;
            }
                
        }
        #endregion

        #region modbus Connected
        public bool Connected { get { if (modbus == null)return false; return modbus.connected; } }
        #endregion
    }
}

Conclusion :


Premier Dépot.....

je cherchais une source tel que celle la depuis lgtps, je l'ai fait !!!
très brouillon mais fonctionnelle.
Toute amélioration, extensions et refontes sont les bienvenues.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.