PC和单片机通过MODBUS RTU通信
最近研究了一下MODBUS通信,在STC12C5A60S2单片机上实现了MODBUS协议的部分功能,方便上位机从单片机系统上获取数据,比如由单片机获取的温度、湿度、或者控制信号的状态等。有了MODBUS协议后,上位机的开发就很方便了,可以使用C#等高级语言通过串口通信,或者使用组态王直接通过串口通信而不需要写代码,这些都归功于MODBUS协议的开放性,很多的组态软件都能提供对他的支持。甚至通过PLC直接可以和单片机通信,比如在PLC系统上没有AD时,可以使用单片也来进行AD,然后通过MODBUS返回给PLC进行相应的控制。
通过MODBUS协议可以实现主机和多个从机进行通谢,而每个从机有唯一的地址,主机就靠这个地址和从机进行通信。每一帧数据都要通过CRC进行校验,保证通信的正确性。
在进行多机通信时只需要把每个从机的串口并到一起即可,见后面的图。
单片机中3号功能的核心代码如下:
unsigned char createRespond_M(unsigned char *respondMessage,unsigned char* _messageReceived ,unsigned int* _registerData)
{
unsigned char i,j;
unsigned char numberOfPoints = ;
unsigned char _slaveAddress = ;
unsigned char bytesToSend = ;
unsigned char startAddress=;
unsigned char crcCalculation[]={,,}; unsigned int CntHi = _messageReceived[]; //将其转换为int型,然后放到高8位。
CntHi = CntHi<<;
numberOfPoints = CntHi| _messageReceived[]; if(numberOfPoints > MaxnumberOfPoints)
{
return ;
} bytesToSend = * numberOfPoints +;
_slaveAddress = _messageReceived[];
respondMessage[] = _slaveAddress;
respondMessage[] = ;
respondMessage[] = * numberOfPoints;
startAddress = (((unsigned int)(_messageReceived[])) << ) | _messageReceived[];
j= ;
for (i = ; i < numberOfPoints; i++)
{
respondMessage[i + j + ] = ((_registerData[startAddress + i] >> ) & 0xff);
respondMessage[i + j + ] =(_registerData[startAddress + i] & 0xff);
j++;
}
calculateCRC(respondMessage, bytesToSend - ,crcCalculation);
respondMessage[bytesToSend - ] = crcCalculation[];
respondMessage[bytesToSend - ] = crcCalculation[];
return bytesToSend;
}
//对接收的数据进行CRC检验,同时判断是否为Address所指定的从机地址和是否为function3功能。
bit CheckRecData(unsigned char * RecData,unsigned char Address)
{
if(RecData[] == Address && RecData[] == ) //地址为自己的地址,同时功能码为3(function 3)
{
if(checkCRC(RecData,))
{
return ;
}
}
return ;
}
本例中每个从机返回80个字节的数据,1号机返回i+1, 2号机返回2*i+1 ,当然在实际运用中只要自己定义所返回的数据的含义即可。比如1,2字节代表温度,3,4字节代表湿度,接下来的4个字节代表P0,P1,P2,P3端口的状态等。可以自由定义,很方便。
具体效果见下图:

把两块板的串口通过杜绑线连在一起。


在TEXTBOX中输入从机的地址,返回相应的数据

如果输入的地址从机不存在,那么通信将会超时,就会提示通信故障。这个是根据通信超时来判断的。
PC和单片机通过MODBUS RTU通信的更多相关文章
- Modbus RTU 通信工具设计(转)
Modbus RTU 通信工具设计 Modbus 是一个工业上常用的通讯协议.一种通讯约定. ModBus 协议是应用层报文传输协议(OSI 模型第7层),它定义了一个与通信层无关的协议数据单元(PD ...
- Modbus RTU 通信应用案例
如何打开项目归档文件 例程中的TIA博途项目文件与STEP 7项目文件均为归档文件,需要按如下方式打开: TIA博途项目文件 1. 打开TIA博途软件,通过软件左下方“项目视图”按钮切换至项目视图: ...
- 对单片机的modbus RTU的详细解释(转载)
Modbus 一个工业上常用的通讯协议.一种通讯约定.Modbus协议包括RTU.ASCII.TCP.其中MODBUS-RTU最常用,比较简单,在单片机上很容易实现.虽然RTU比较简单,但是看协议资料 ...
- FreeModbus 移植于STM32 实现Modbus RTU通信
http://ntn314.blog.163.com/blog/static/161743584201233084434579/ 毕业设计自己要做个基于STM32的PLC能直接跑语句表的,现在看来好像 ...
- Modbus RTU新版本指令介绍
Modbus RTU新版本指令介绍 TIA V13 SP1版本软件中提供了2个版本的Modbus RTU指令: 图1. 两个版本Modbus RTU指令 早期版本的Modbus RTU指令(图1. 中 ...
- Modbus RTU 介绍
S7-1200 Modbus RTU 通信概述 Modbus具有两种串行传输模式:分别为ASCII和RTU.Modbus是一种单主站的主从通信模式,Modbus网络上只能有一个主站存在,主站在Modb ...
- C# NModbus RTU通信实现
Modbus协议时应用于电子控制器上的一种通用语言.通过此协议,控制器相互之间.控制器经由网络/串口和其它设备之间可以进行通信.它已经成为了一种工业标准.有了这个通信协议,不同的厂商生成的控制设备就可 ...
- 单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等(转)
源:单片机modebus RTU通信实现,采用C语言,可适用于单片机,VC,安卓等 //modebus_rtu.c /***************************************** ...
- C# 开发Modbus Rtu客户端 modbus测试Demo,Modbus 串口通信 , 虚拟MODBUS-RTU测试
前言 本文将使用一个NuGet公开的组件技术来实现一个ModBus RTU的客户端,方便的对Modbus rtu的服务器进行读写,这个服务器可以是电脑端C#设计的,也可以是PLC实现的,也可以是其他任 ...
随机推荐
- Java三大主流框架概述(转载)
转自:http://www.douban.com/note/320140839/ Struts.Hibernate和Spring是我们Java开发中的常用关键,他们分别针对不同的应用场景给出最合适的解 ...
- IOS 整理
防止程序进入休眠状态 设置应用程序的 idleTimerDisabled 属性为 YES (默认为NO) [UIApplication sharedApplication].idleTimerDisa ...
- MAC上更新Ruby失败解决办法
尝试用RVM升级Ruby http://blog.csdn.net/lissdy/article/details/9191351 如果碰到下面问题 Searching for binary rubie ...
- oracle数据库使用之数据查询入门
1.在查询过程中使用算术表达式对数据进行运算 student表结构如下: 最后一项salary表示每个人的月薪,我现在想查询每个人的年薪: 2.使用nvl函数处理null值,向表中插入一条数据,该数据 ...
- Ⅴ.AngularJS的点点滴滴-- 资源和过滤
资源ngResource(依赖ngResource模块) <html> <script src="http://ajax.googleapis.com/ajax/libs/ ...
- 指针做MAP的KEY的TEST
用struct做map的key会需要"operator <"等等,还会出现奇怪的问题可能. 试了下用指针做key,看看效果: #include <iostream> ...
- Google Map API v2 步步为营 (二)----- Location
接上篇. 改造一下MapsActivity: public class MapsActivity extends Activity implements LocationListener, InfoW ...
- 加密算法 DES 3DES RSA AES 简介
数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为[密文],使其只能在输入相应的[密钥]之后才能显示出本来内容,通过这样的途径来达到保护数据不被非法人 ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(一)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- css3 盒模型
0,前言 在css2.1 之前,我们都熟知的两种盒模型,一种是w3c标准盒模型,另外一种是怪异模式下的盒模型.在css3之前我们一直使用的是标准盒模型,但是标准盒模型的宽度总是需要小心的去使用,稍有不 ...