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.
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.