博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#和Modbus通信工程
阅读量:6478 次
发布时间:2019-06-23

本文共 5772 字,大约阅读时间需要 19 分钟。

先介绍一下,这个项目是Modbus和C#关于声音播放器的内容。这篇文章介绍的事ModBus中串口的协议,相信看到这篇文章的都知道ModBus协议,先介绍主流的两种串口和TCP协议。

下载虚拟串口软件地址:

下载调试精灵软件地址:

关于Modbus的内容就不多介绍,我介绍也是去网上查,可以先去查一下Modbus原理。

根据CModbusSlave类。先行下载研究类库:里面有方法读取,编写。根据读取寄存器内容(一个和多个)对应方法。CModbusSlave类下载地址:项目中包含

C#连接串口:

private static void ThreadSendCom()

{
Form1 operform2 = Form1.Instance();
while (true)//线程一直在发送,主程序做好标记,
{
//开始读写模块,功能16写
//把数字量模拟量进行IO分配。
Writing = false;
if (MainAskForStop)
{
Thread.Sleep(100);
continue;
}
try
{
if (!operform2.myserialPort.IsOpen)//避免这个访问无效
Thread.Sleep(500);
else if (operform2.myserialPort.IsOpen)//只要代开串口了,就发
{
Writing = true;
//Zigbee no need
//等待80ms,实际上可以更快,但是一定是完成通信后再继续。如果无法完成。在
//多个模块时,后续无法通信,干脆一直等待。AS3730模块程序可能有问题,有时需要
//关闭,打开串口才能通信。
if (ReciveOK)//20170521,如果没有收到就无限等待。避免485冲突,以后修改为以太网的。
{
//CModbusMasterAndModelConfig.SendDataToAS3700(operform2.myserialPort,0);
if (MainAskForStop)
{
Writing = false;
break;//直接跳出
}
Form1.SendCounter++;//每个模块一次
//SendID[ModelIndex] = 3;//标记
ReciveOK = false;
Thread.Sleep(80);
while (ReciveOK == false && MainAskForStop == false)//不断等待
{
Thread.Sleep(80);//20170521总是AS3700错误,修改到2倍等待时间。,增加到120,8个模块,880ms。以前80ms,等待100ms,再次发送。要求模块不要超过10个,而且模块的返回时间不要超过150ms
}
}
else if (MainAskForStop == false)
{
Thread.Sleep(80);
}

Writing = false;

}
}
catch (Exception ew1)
{
Debug.WriteLine(ew1.ToString());
Writing = false;
}
}//while串口打开的,就不断执行,否则退出。
}

private void OpenComm()

{
//if (MasterComPort > 0 && MasterComPort < 255)
//{
// try
// {
// //lock (m_locker)
// //{
// if (myserialPort.IsOpen)
// {
// myserialPort.Close(); //如果是打开的,则关闭一次
// }
// myserialPort.PortName = "COM" + MasterComPort.ToString();
// myserialPort.BaudRate = 115200;// 20160525修改为115200,以前是9600;
// myserialPort.Parity = Parity.None;
// myserialPort.DataBits = 8;
// myserialPort.StopBits = StopBits.One;
// myserialPort.Encoding = Encoding.ASCII;// Encoding.ASCII;
// myserialPort.ReceivedBytesThreshold = 1;//一个数据就中断
// myserialPort.WriteTimeout = 1000;
// myserialPort.ReadTimeout = 1000;
// //打开串口,主站采用线程不断发送
// if (myserialPort.IsOpen == false)//如果=0,可能没有设置,就没有从站
// {
// myserialPort.Open();
// if (thIsStart == false)
// {
// Thread th = new Thread(new ThreadStart(ThreadSendCom)); //也可简写为new Thread(ThreadMethod);
// th.Name = "CIS_AS3700_COM_SEND";
// th.Start(); //启动线程
// thIsStart = true;//只启动一次
// }
// }
// //}

// }

// catch (Exception ew1)
// {
// if (hadShowComError == false)
// {
// MessageBox.Show("指定的IO模块通信串口COM" + MasterComPort + "异常,可能不存在或已经打开", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
// hadShowComError = true;
// }
// Debug.WriteLine(ew1.ToString());
// }
//}
if (SlaveComPort > 0 && SlaveComPort < 255)
{
if (myserialPortS.IsOpen) myserialPortS.Close(); //如果是打开的,则关闭一次
myserialPortS.PortName = "COM" + SlaveComPort.ToString();
myserialPortS.BaudRate = 115200;// 20160525修改为115200,以前是9600;
myserialPortS.Parity = Parity.None;
myserialPortS.DataBits = 8;
myserialPortS.StopBits = StopBits.One;
myserialPortS.Encoding = Encoding.ASCII;
myserialPortS.ReceivedBytesThreshold = 1;
//打开从站串口,但是没有必要开启线程。
try
{
if (myserialPortS.IsOpen == false)
{
myserialPortS.Open();
}
}
catch (Exception ew2)
{
if (hadShowComError == false)
{
MessageBox.Show("指定的Modbus从站串口" + SlaveComPort + "异常,可能不存在或已经打开", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning);
hadShowComError = true;
}
}
}
}

 C#接受数据:

private void myserialPortS_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)

{
SerialPort a = myserialPortS;//传递到静态的CModbusSlave
try//20170626出现串口是关闭的。
{
byte[] b = new byte[myserialPortS.BytesToRead];//定义byte数组,serialPort读取数据
myserialPortS.Read(b, 0, b.Length);
bufferSlave.AddRange(b);
if (bufferSlave.Count >= 8) //数据超过45个,所以一定要返回20个数据。0,0,0
{//进行从站分析,并发送数据。
//byte SoundfileIndex = bufferSlave.ToArray()[5];
//if (SoundfileIndex == 1)
//{
// var p3 = new System.Windows.Media.MediaPlayer();
// p3.Open(new System.Uri("C:\\Users\\Administrator\\Desktop\\sound\\到站提示音.mp3"));
// p3.Play();
//}
//if(SoundfileIndex==2)
//{
// var p3 = new System.Windows.Media.MediaPlayer();
// p3.Open(new System.Uri("C:\\Users\\Administrator\\Desktop\\8960.wav"));
// p3.Play();
//}
//var p = new System.Windows.Media.MediaPlayer();
if (CModbusSlave.checkComm0Modbus(a, bufferSlave.ToArray(), (UInt16)(bufferSlave.Count))=="0")
{
//p.Open(new System.Uri("C:\\Users\\Administrator\\Desktop\\sound\\地铁关门报警声.mp3"));
// p.Stop();
wmp.controls.stop();
}
if (CModbusSlave.checkComm0Modbus(a, bufferSlave.ToArray(), (UInt16)(bufferSlave.Count)) == "1")
{
//p.Open(new System.Uri("C:\\Users\\Administrator\\Desktop\\sound\\地铁关门报警声.mp3"));
//p.Play();
// wmp.URL = "C:\\Users\\Administrator\\Desktop\\sound\\地铁关门报警声.mp3";
wmp.URL =listView1.Items[0].Tag.ToString();
wmp.controls.play();
}
if (CModbusSlave.checkComm0Modbus(a, bufferSlave.ToArray(), (UInt16)(bufferSlave.Count)) == "2")
{
//p.Open(new System.Uri("C:\\Users\\Administrator\\Desktop\\sound\\火车到站鸣笛声.mp3"));
//p.Play();
wmp.URL = listView1.Items[1].Tag.ToString();
wmp.controls.play();
}
if (CModbusSlave.checkComm0Modbus(a, bufferSlave.ToArray(), (UInt16)(bufferSlave.Count)) == "3")
{
wmp.URL = listView1.Items[2].Tag.ToString();
wmp.controls.play();
}
if (CModbusSlave.checkComm0Modbus(a, bufferSlave.ToArray(), (UInt16)(bufferSlave.Count)) == "4")
{
wmp.URL = listView1.Items[3].Tag.ToString();
wmp.controls.play();
}
if (CModbusSlave.checkComm0Modbus(a, bufferSlave.ToArray(), (UInt16)(bufferSlave.Count)) == "5")
{
wmp.URL = listView1.Items[4].Tag.ToString();
wmp.controls.play();
}
if (CModbusSlave.checkComm0Modbus(a, bufferSlave.ToArray(), (UInt16)(bufferSlave.Count)) == "6")
{
wmp.URL = listView1.Items[5].Tag.ToString();
wmp.controls.play();
}
bufferSlave.RemoveRange(0, bufferSlave.Count);//全部删除
}
}
catch (Exception ew1)
{
}
}

 

项目下载地址:

转载于:https://www.cnblogs.com/wxylovejx/p/8384825.html

你可能感兴趣的文章
我从程序猿到DBA的进化之路
查看>>
ClassLoader原理扩展
查看>>
MongoDB基本使用
查看>>
CAT 测试事件开关
查看>>
php实现工厂模式
查看>>
mirror driver学习(二. 安装)
查看>>
zz:控制台程序后台运行
查看>>
【超清视频】CCNA系列课程之三:交换机工作原理及VLAN创建
查看>>
Exchange2010学习笔记之 解决从远程服务器处理数据失败问题
查看>>
python GUI 猜数字游戏
查看>>
awk相关用法
查看>>
oracle中创建java包.执行JAVA代码的方法
查看>>
线上查询及帮助命令
查看>>
我的友情链接
查看>>
php mysql数据库导出sql文件
查看>>
web.xml 3.0头文件
查看>>
Hibernate缓存
查看>>
如何从程序员到架构师,不断总结补充中
查看>>
使用Eclipse给Android App签名打包
查看>>
snort的规则
查看>>