描述:-
不通厂家的模块协议可能不一样,普遍通用,本次分享的是【康耐德】的模块;如果用到其他模块的朋友通过下面的介绍无法控制,那就要自己另寻他法了。
协议:ModbusTCP
一如既往,首先来张demo截图:
a、按钮上的1,2分别代表两个道闸;
b、接触过开关控制器的都知道,2路组成一个开关,如指令 1,0代表开;0,1代表关,同时发1,0,1,0代表两头都开,反之则都关

开始了,上代码。。。
直接上完整代码,需要可运行exe完整源码或程序的联系我无偿提供:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ModbusTCP;
using System.Collections;
using System.Threading;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private ModbusTCP.Master MBmaster;
string StartAddress = "200";
string DOStartAddress = "100";
private bool RecvieMode_502 = false;
string dataSize = "16";
byte uiSlaveID = 255;
private int Recvie_Count = 0;
string redIP = "172.16.1.237";
public Form1()
{
InitializeComponent();
}
private void btnConnect_Click(object sender, EventArgs e)
{
redIP = txtIP.Text;
if (RecvieMode_502)
{
return;
}
try
{
MBmaster = new Master(redIP, 502);
MBmaster.OnResponseData += new ModbusTCP.Master.ResponseData(MBmaster_OnResponseData);
MBmaster.OnException += new ModbusTCP.Master.ExceptionData(MBmaster_OnException);
RecvieMode_502 = true;
MBmaster.autoConnectOfBreak = false;
MessageBox.Show("连接成功!!");
}
catch (SystemException error)
{
MessageBox.Show(error.Message);
}
}
private void MBmaster_OnResponseData(ushort ID, byte function, byte[] values)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new ModbusTCP.Master.ResponseData(MBmaster_OnResponseData), new object[] { ID, function, values });
return;
}
if (ID == 0xFF) return;
ushort Func = ID;
++Recvie_Count;
if (Recvie_Count > 100000000)
{
Recvie_Count = 1;
}
bool[] bits = new bool[1];
if (Func > 0)
{
richTextBox1.Clear();
if (null != values)
{
int i = 1;
int dzNo = (i - 1) * 4;
BitArray bitArray = new BitArray(values);
bool[] bs = new bool[bitArray.Count];
bitArray.CopyTo(bs, 0);
if (bs.Count(a => a == false) == 15)
{
return;
}
bool[] bitsArr = new bool[bitArray.Count];
for (int k = 0; k < bitArray.Count - dzNo; k++)
{
bitsArr[k] = bs[k + dzNo];
richTextBox1.AppendText(Convert.ToInt32(bitsArr[k]).ToString());
}
bits = bitsArr;
}
if (richTextBox1.Visible && !richTextBox1.IsDisposed)
{
richTextBox1.AppendText(string.Format("\r\n红外接收结果:{0} {1} {2} {3}\r\n", bits[0], bits[1], bits[2], bits[3]));
}
#region
#endregion
}
}
#region 通讯常提示事件
private void MBmaster_OnException(ushort id, byte function, byte exception)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new ModbusTCP.Master.ExceptionData(MBmaster_OnException), new object[] { id, function, exception });
return;
}
string exc = "Modbus says error: ";
switch (exception)
{
case Master.excIllegalFunction: exc += "Illegal function!"; break;
case Master.excIllegalDataAdr: exc += "Illegal data adress!"; break;
case Master.excIllegalDataVal: exc += "Illegal data value!"; break;
case Master.excSlaveDeviceFailure: exc += "Slave device failure!"; break;
case Master.excAck: exc += "Acknoledge!"; break;
case Master.excSlaveIsBusy: exc += "Slave is busy!"; break;
case Master.excGatePathUnavailable: exc += "Gateway path unavailbale!"; break;
case Master.excExceptionTimeout: exc += "Slave timed out!"; break;
}
}
#endregion
#region 读取点
private void btnReadDisInp_Click(object sender, EventArgs e)
{
ushort ID = 2;
ushort StartAddress = ReadStartAdr();
ushort Length = Convert.ToUInt16(dataSize);
MBmaster.ReadDiscreteInputs(ID, StartAddress, Length, uiSlaveID);
}
private ushort ReadStartAdr()
{
if (StartAddress.IndexOf("0x", 0, StartAddress.Length) == 0)
{
string str = StartAddress.Replace("0x", "");
ushort hex = Convert.ToUInt16(str, 16);
return hex;
}
else
{
return Convert.ToUInt16(StartAddress);
}
}
#endregion
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
ChangDZ(Convert.ToInt32(textBox1.Text), Convert.ToBoolean(Convert.ToInt32(textBox2.Text)), Convert.ToBoolean(Convert.ToInt32(textBox3.Text)));
}
private void ChangDZ(int dzNo, bool b1, bool b2)
{
ushort ID = 6;
int sized = Convert.ToInt32(dataSize);
ushort StartAddress = Convert.ToUInt16(DOStartAddress);
byte[] data = new byte[sized];
bool[] bits = new bool[sized];
string s = richTextBox1.Text;
int st = (dzNo - 1) * 2;
bits[st] = b1;
bits[st + 1] = b2;
int dl = bits.Length / 8 + (bits.Length % 8 == 0 ? 0 : 1);
data = new byte[dl];
BitArray ba = new BitArray(bits);
ba.CopyTo(data, 0);
if (MBmaster != null)
{
MBmaster.WriteMultipleCoils(ID, StartAddress, (ushort)sized, data, uiSlaveID);
}
}
private void ChangDZ2(bool b1, bool b2, bool b3, bool b4)
{
lock (MBmaster)
{
int i = Convert.ToInt32(1);
int dzNo = (i - 1) * 2 + 1;
ushort ID = 6;
int sized = Convert.ToInt32(dataSize);
ushort StartAddress = Convert.ToUInt16(DOStartAddress);
byte[] data = new byte[sized];
bool[] bits = new bool[sized];
string s = richTextBox1.Text;
int st = (dzNo - 1) * 2;
bits[st] = b1;
bits[st + 1] = b2;
bits[st + 2] = b3;
bits[st + 3] = b4;
int dl = bits.Length / 8 + (bits.Length % 8 == 0 ? 0 : 1);
data = new byte[dl];
BitArray ba = new BitArray(bits);
ba.CopyTo(data, 0);
if (MBmaster != null)
{
MBmaster.WriteMultipleCoils(ID, StartAddress, (ushort)sized, data, uiSlaveID);
}
}
}
private void button2_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(3000);
ChangDZ2(Convert.ToBoolean(Convert.ToInt32(textBox4.Text)), Convert.ToBoolean(Convert.ToInt32(textBox5.Text)), Convert.ToBoolean(Convert.ToInt32(textBox6.Text)), Convert.ToBoolean(Convert.ToInt32(textBox7.Text)));
}
private void btn_kg_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ2(true, false, false, true);
}
int getMiCeccond()
{
int a = 0;
int.TryParse(textBox8.Text, out a);
return a != 0 ? a : 2000;
}
private void btn_gk_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ2(false, true, true, false);
}
private void btn_kk_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ2(true, false, true, false);
}
private void btn_gg_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ2(false, true, false, true);
}
private void btn_1k_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ(1, true, false);
}
private void btn_1g_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ(1, false, true);
}
private void btn_2k_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ(2, true, false);
}
private void btn_2g_Click(object sender, EventArgs e)
{
ChangDZ2(false, false, false, false);
Thread.Sleep(getMiCeccond());
ChangDZ(2, false, true);
}
}
}

个人签名:己所不欲勿施于人