对S7通信的连接的理解以及对比CAN通信协议来理解PLC通讯
对S7通信的连接的理解以及对比CAN通信协议来理解PLC通讯。
对功能块 SFB12 和 SFB13 的R_ID参数的理解 ?
对于同一个数据包。发送方与接收方的R_ID应该相同。
用下图解释
双向连接中
DP400可以充当主机 主动往DP300内写数据 或者主动将DP300中的数据读取出来。
DP300可以充当主机 主动往DP400 内写数据 或者主动将DP400中的数据读取出来。
双向连接中的两个机器中 均有通讯程序。
假设DP400调用SFB12 "Bsend"功能块 发送的是设定转矩控制字、该消息帧的R_ID=1 ,那么 DP300中调用 SFB13 "Brcv"功能块的R_ID
必须为1,才能接收到这个设定转矩控制字的消息帧。
DP300接收的数据帧 先放在接收缓冲区里面, 待DP300的主扫描程序使用该数据以后,读取以后将该缓冲区清零。
最起码51单片机配合SJA1000 CAN控制器 的接收 的主main()
程序是这样处理的, 当SJA1000接收到合适的消息帧以后,会请求51单片机中断,单片机中断将数据从接收缓冲区拷贝出来以后,在中断里面将接收缓冲区清空。
假设 DP300调用SFB12"Bsend"功能块,发送的是获取DP400的电压和电流控制指令。此数据帧的R_ID=2 那么DP400调用SFB13的"BRCV"功能块的R_ID必须为2,才能接收到这个指令 。
实际上 ,功能块SFB12"BSEND" 和功能块 "BRCV"都是 软件中驱动层的东西,是往数据区 写操作 或者 读操作 。至于具体的软件通讯协议。需要程序 根据 确定的数据区 里面的内容 再次细化程序。
例如
假设PLC 400中 有两个数据块 DB1 和 DB2
DB1里面的结构体数组ARAY[1..100]用来存放 400PLC中要发送的数据。
DB2里面的结构体数据ARAY[1..100]用来存放 400PLC中要接收的数据
通信伙伴PLC300 中也有两个数据块 DB1和DB2
DB1里面的结构体数组ARAY[1..100]用来存放 300PLC中要发送的数据。
DB2里面的结构体数据ARAY[1..100]用来存放 300PLC中要接收的数据
400和300的驱动层的通信 实际上就是 通过设置SFB12 SFB13 里面的R_ID 然后实现了 将
DP400PLC中的DB1的ARAY[]里面的内容复制到DP300PLC数据块DB2中的ARAY[] 里面 DP300PLC根据接收到DB2中ARAY[]中的内容再做进一步的程序处理。
问题2 既然有了R_ID 就是建立成功通讯成功的关键因素吗?
假设网络上有多个设备
在上图中 假设1号DP300只想设定2号DP300的转速,根据上图3号DP300的也会接收,但是如果建立了S7接连。组态1号的DP300的连接号码为1 组态2号DP300的连接号码为1 组态3号DP300的连接号不是1 。
实际上,在调用SFB12 SFB13 本来就指定了连接号,这也是必要的,PLC的S7连接属于静态连接。
当然 还可以在OB1里面再编写几个SFB12 SFB13 通过不同的R_ID来确定不同的数据帧。
现在回到你的CAN总线的认识以及对比CAN通信 和PLC的S7通信
CAN发送的消息的数据帧包括29位ID号和8个字节的数据。CAN总线上的节点根据basican pelican 单滤波 还是双滤波 来决定是否接收该数据帧。
假设某一时刻 A节点发送给B节点一个数据帧 该数据帧的ID号为0X19881205
则只有B接收,若另外一个时刻 节点E在网络上发送一个数据帧,ID号为0x19881205 则还是B接收,但是B不知道是A发送给他的,还是E发送给他的,于是才有了Ican 协议。将29位ID进行分割,有源节点号,目标节点号,是响应帧还是命令帧。是否需要应答等等,此外还需要对通信进行优化, 即 先通信之前 首先要进行握手。建立连接。
例如节点A访问节点B 需要先建立连接,握手,然后在连接时间内,进行一问一答,如果在连接时间内,不应答,则退出连接。
每次从机在接收到一帧消息后都会重置连接时间 以重新倒计时,
以防止出现中断超时现象。
节点C访问节点B,则必须先与节点B建立连接。若此时节点B正在和节点A通讯,则节点B会给节点C发送连接中的状态。
上述的建立连接是一个动态的过程 是动态连接。
有一个特点:
对CAN接收节点来讲,只要接收到的消息的ID号码与自己滤波器设置的一样,就会接收到消息,对于51单片机和CAN控制器SJA1000编写的程序,每次SJA1000接收到正确的数据以后,都会对51单片机产生中断,51单片机响应中断以后,必须用指令清空缓冲区。
由于51单片机和SJA1000组成的系统,SJA1000 CAN接收区只有一个13字节的缓冲区,(刚好是一个字节帧信息,4个字节帧ID
8个字节数据)。相当于只有一个邮箱,那么某一时刻只能有一个连接。当该连接结束以后,才能启动另外一个连接。
像DSP2812这样的32位处理器,它有32个邮箱,每个邮箱有13个字节,那么理论上它可以建立32个连接。
假设用DSP2812作为整车控制器,用1号邮箱接收电机控制器上传的状态,用2号邮箱作为接收电池BMS控制系统上传的状态,用3号邮箱作为接收仪表盘上传的数据, 相当于建立了多个静态连接,
最后在整车控制器(CPU为DSP2812)里面的程序顺序的读取1号邮箱 2号邮箱 3号邮箱 上传的数据就可以了, 现在回归到PLC里面。 实际上的连接号 就规定了 通信的两个对象和,例如下图中的1号连接就是1号DP400 与2号DP400 的通信。
2号静态连接 就是1号DP400与3号DP400的通信。
对S7通信的连接的理解以及对比CAN通信协议来理解PLC通讯的更多相关文章
- 实训41 S7通信 单向连接 基于DP网络通信
连接的基本概念? 连接是指两个通信伙伴之间执行通信服务建立的逻辑链路,而不是指两个站之间用物理媒体(例如电缆)实现的连接. 连接相当于 通信伙伴之间 一条虚拟的"专线". 一条物理 ...
- 基于S7-PLCSIM Advanced搭建S7通信仿真环境
写在前面: 之前有专门讲过一期如何搭建西门子PLC的S7通信仿真环境,感兴趣的可以点击查看:戳↓ 1.基于TIA搭建西门子PLC仿真环境及通信方案-联合出品 2.手把手教你搭建西门子PLC仿真环境 那 ...
- Python通过snap7库与西门子S7-1200建立S7通信,读写存储器数据,顺便写个流水灯
1.snap7 简介 snap7 是一个基于以太网与S7系列的西门子PLC通讯的开源库. 支持包括S7系列的S7-200.S7-200 Smart.S7-300.S7-400.S7-1200以及S7- ...
- 通信有连接有消息队列选择boost.asio
通信有连接有消息队列选择boost.asio 连接自主管理 消息队列自主管理
- USB通信协议——深入理解
USB通信协议——深入理解 0. 基本概念 一个[传输](控制.批量.中断.等时):由多个[事务]组成: 一个[事务](IN.OUT.SETUP):由一多个[Packet]组成. USB数据在[主机软 ...
- 线代笔记 #01# 几何水平上的理解 VS. 数值水平上的理解
源: 线性代数的本质 内容来自字幕. Let me quote without further comment from Dieudonné's "Foundations of Modern ...
- java String长度与varchar长度匹配理解(字符和字节长度理解)
java String长度与varchar长度匹配理解(字符和字节长度理解) string中的length()长度,返回的是char的数量,每个char可以存储世界上任何类型的文字和字符,一个char ...
- Python 32 通信循环 连接循环 粘包问题
一:通信循环 二:连接循环 三:粘包问题
- web通信 长连接、长轮询
http://www.cnblogs.com/hoojo/p/longPolling_comet_jquery_iframe_ajax.html
随机推荐
- 基础总结篇之七:ContentProvider之读写短消息
转自:http://blog.csdn.net/wellsoho/article/details/49494167 今天我们来讲一下如何利用ContentProvider读写短消息. 上次我们讲了如何 ...
- 开关机安全控制!(设置进入bois的密码)
1.调整 BOIS 引导设置(1)将第一引导设备设为当前系统所在硬盘 (2)设置管理员密码 (3)进入bois后如图所示需输入bols密码才能登入
- 关于python 3.x import matplotlib as plt ImportError: DLL load failed: 找不到指定的模块
windows 10下使用conda update --all更新过后,就出现这样的问题了,各种包不能用了,然后在stackoverflow上搜到有人也遇到相同的问题,并通过其中的回答找到了原因,这里 ...
- python集合操作方法详解
前言 说集合之前,我们先说一个小例子,假设某公司有五个人喜欢打篮球,五个人喜欢打游戏,问即打游戏有打篮球的人都有哪些? play_basketball = ['a','b','c','d','e'] ...
- redhat7.6 httpd 匿名目录 目录加密 域名跳转
配置文件/etc/httpd/conf/httpd.conf 监听80端口和8080端口 1.80端口 2.域名 3.index.html目录 4.网站目录 options Indexes //代 ...
- Python编程使用PyQT制作视频播放器
最近研究了Python的两个GUI包,Tkinter和PyQT.这两个GUI包的底层分别是Tcl/Tk和QT.相比之下,我觉得PyQT使用起来更加方便,功能也相对丰富.这一篇用PyQT实现一个视频播放 ...
- 珠心算测验(0)<P2014_1>
珠心算测验 (count.cpp/c/pas) 问题描述] 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得 ...
- 数据库先系统与原理第三章笔记:数据库SQL查询语言
SQL概述 SQL发展 SQL特点 SQL查询基本概念 单表查询 投影查询 1.查询指定列: SELECT 列名1,列名2,列名3,.....FROM Table_Name; #查询全部列:SELEC ...
- Linux(Centos)安装图形化界面步骤
最近有重新来捣鼓捣鼓Linux了,这次撸的版本是centos7.4的,虽然说是不要桌面,但是感觉还是安装一下比较好balalalala.........废话不说的直接进入正题: 安装X 首先安装X(X ...
- Educational Codeforces Round 72 (Rated for Div. 2)E(线段树,思维)
#define HAVE_STRUCT_TIMESPEC#include<bits/stdc++.h>using namespace std;#define BUF_SIZE 100000 ...