要使用Modbus RTU协议读取三菱PLC从站1的40001地址,需要按照以下步骤进行编程:
配置串口通信参数,例如波特率、数据位、校验位和停止位等。
构建Modbus RTU协议的读取命令,命令格式为:
从站地址(1字节) + 功能码(1字节) + 起始地址(2字节) + 寄存器数量(2字节) + CRC校验(2字节)
其中,从站地址为1,功能码为03,起始地址为40001,寄存器数量为1,CRC校验为命令中除CRC字段以外的所有字节的CRC16校验值。
将命令通过串口发送给PLC,等待PLC响应。
解析PLC返回的响应数据,从中获取所需数据。
注意事项:
在编程过程中应注意Modbus RTU协议的数据格式,如字节顺序和数据类型等。
在发送命令和解析响应数据时,应注意处理异常响应,例如非法功能码或地址等。
FX系列PLC的程序段:
MC:MODBUS_RECEIVE_COMMAND
LD X0 ; 设置从站地址
STL $W8 ; 将从站地址存入D8000
LD 8 ; 设置寄存器数量
STL $W10 ; 将寄存器数量存入D8002
LD 40001 ; 设置起始地址
STL $W12 ; 将起始地址存入D8004
LD 3 ; 设置读取命令功能码
STL $W14 ; 将功能码存入D8006
CALL 'MODBUS_RECEIVE' ; 调用MODBUS_RECEIVE指令
MOV $W16,D8100 ; 将D8100-D8105寄存器的值拷贝到D2000-D2005中
MOV $W18,D8102 ; 将D8102-D8105寄存器的值拷贝到D2006-D2009中
RET
MC:MODBUS_RECEIVE
LOCAL STR[8] ; 定义本地变量
STL $W10 ; 将寄存器数量存入本地变量
STL $W12 ; 将起始地址存入本地变量
STL $W14 ; 将功能码存入本地变量
MOV 4,STR[0] ; 设置串口号,根据实际情况修改
MOV 9600,STR[1] ; 设置波特率
MOV 0,STR[2] ; 设置数据位
MOV 0,STR[3] ; 设置校验位
MOV 0,STR[4] ; 设置停止位
MOV 500,STR[5] ; 设置超时时间(单位:ms)
MOV 16,STR[6] ; 设置每个数据位所需时间(单位:us)
MOV 100,STR[7] ; 设置读写等待时间(单位:ms)
MOVE STR,D2000 ; 将本地变量的值拷贝到D2000-D2007中
CALL 'MODBUS_RECEIVE' ; 调用MODBUS_RECEIVE指令
RET
Q系列PLC的程序段:
MC:MODBUS_RECEIVE_COMMAND
MOV 100,D8040 ; 设置串口号,根据实际情况修改
MOV 9600,D8041 ; 设置波特率
MOV 0,D8042 ; 设置数据位
MOV 0,D8043 ; 设置校验位
MOV 0,D8044 ; 设置停止位
MOV 500,D8045 ; 设置超时时间(单位:ms)
MOV 16,D8046 ; 设置每个数据位所需时间(单位:us)
MOV 100,D8047 ; 设置读写等待时间(单位:ms)
MOV 8,D8010 ;
MOV 1,D8012 ; 设置从站地址
MOV 3,D8013 ; 设置读取命令功能码
MOV 40001,D8014 ; 设置起始地址
MOV 8,D8016 ; 设置寄存器数量
CALL "MODRD" ; 调用MODRD指令
MOV #D8020,D110 ; 将读取结果拷贝到D8020-D8027中
RET
MODRD指令需要在程序中先定义,具体定义方法可参考GX Works2的帮助文档。
需要注意的是,上述代码中的串口号、波特率等参数需要根据实际情况进行修改,且不同型号的三菱PLC编程语言略有不同。建议在编写程序前先查看相应的编程手册和帮助文档。
需要添加读写设备。
USBHID协议,该协议可下载获得,添加USBMifare卡系列读写设备就可以读写yhk、公交卡、校园卡、燃气卡、MifareS50卡、sd卡等。
通过USB口实现同PC机及相关设备连接,USB采用无驱技术,方便用户使用以及维护,产品支持ISO14443TYPEA标准非接触式IC卡读写,提供各种平台的驱动开发包。
当然要依赖硬件,协议类似于对情报的加密规则,有了加密规则才知道情报的密文是什么。情报本身肯定需要人员来传送的。modbus一般用在485的接口上,实现一主机多从机的通信,你可以去看一下modbus中文协议,有个国家标准,详细说到这个了。
modbus涉及到通信的第六七层,应用层,485接口属于物理层。
国家标准叫 GB-T19582-2008通信协议(三部分)[基于Modbus的工业自动化网络协议]
Socket套接字,是由系统提供用于网络通信的技术( *** 作系统给应用程序提供的一组API叫做Socket API),是基于TCP/IP协议的网络通信的基本 *** 作单元。基于Socket套接字的网络程序开发就是网络编程。
socket可以视为是应用层和传输层之间的通信桥梁;
传输层的核心协议有两种:TCP,UDP;socket API也有对应的两组,由于TCP和UDP协议差别很大,因此,这两组API差别也挺大。
分类:
Socket套接字主要针对传输层协议划分为如下三类:
流套接字:使用传输层TCP协议
TCP,即Transmission Control Protocol(传输控制协议),传输层协议;
TCP的特点:
有连接:像打电话,得先接通,才能交互数据;
可靠传输:传输过程中,发送方知道接收方有没有收到数据(打电话就是可靠传输);
面向字节流:以字节为单位进行传输(非常类似于文件 *** 作中的字节流);
全双工:一条链路,双向通信;
有接收缓冲区,也有发送缓冲区。
大小不限
对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的情况下,是无边界的数据,可以多次发送,也可以分开多次接收。
数据报套接字:使用传输层UDP协议
UDP,即User Datagram Protocol(用户数据报协议),传输层协议。
UDP的特点:
无连接:像发微信,不需要接通,直接就能发数据;
不可靠传输:传输过程中,发送方不知道接收方有没有收到数据(发微信就是不可靠传输);
面向数据报:以数据报为单位进行传输(一个数据报都会明确大小)一次发送/接收必须是一个完整的数据报,不能是半个,也不能是一个半;
全双工:一条链路,双向通信;
有接收缓冲区,无发送缓冲区;
大小受限:一次最多传输64k;
对于数据报来说,可以简单的理解为,传输数据是一块一块的,发送一块数据假如100个字节,必须一次发送,接收也必须一次接收100个字节,而不能分100次,每次接收1个字节。
原始套接字
原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。
二、UDP数据报套接字编程
UDPSocket中,主要涉及到两类:DatagramSocket、DatagramPacket;
DatagramSocket API
DatagramSocket 创建了一个UDP版本的Socket对象,用于发送和接收UDP数据报,代表着 *** 作系统中的一个socket文件,( *** 作系统实现的功能–>)代表着网卡硬件设备的抽象体现。
DatagramSocket 构造方法:
方法签名 方法说明
DatagramSocket() 创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端)
DatagramSocket(int port) 创建一个UDP数据报套接字的Socket,绑定到本机指定的端口(一般用于服务端)
DatagramSocket 方法:
方法签名 方法说明
void receive(DatagramPacket p) 从此套接字接收数据报(如果没有接收到数据报,该方法会阻塞等待)
void send(DatagramPacket p) 从此套接字发送数据报包(不会阻塞等待,直接发送)
void close() 关闭此数据报套接字
DatagramPacket API
代表了一个UDP数据报,是UDP Socket发送和接收的数据报,每次发送/接收数据报,都是在传输一个DatagramPacket对象。
DatagramPacket 构造方法:
方法签名 方法说明
DatagramPacket(byte[] buf, int length) 构造一个DatagramPacket以用来接收数据报,接收的数据保存在字节数组(第一个参数buf)中,接收指定长度(第二个参数length)
DatagramPacket(byte[] buf, int offset, int length,SocketAddress address) 构造一个DatagramPacket以用来发送数据报,发送的数据为字节数组(第一个参数buf)中,从0到指定长度(第二个参数length)。address指定目的主机的IP和端口号
DatagramPacket 方法:
方法签名 方法说明
InetAddress getAddress() 从接收的数据报中,获取发送端主机IP地址;或从发送的数据报中,获取接收端主机IP地址
int getPort() 从接收的数据报中,获取发送端主机的端口号;或从发送的数据报中,获取接收端主机端口号
byte[] getData() 获取数据报中的数据
构造UDP发送的数据报时,需要传入 SocketAddress ,该对象可以使用 InetSocketAddress 来创建。
InetSocketAddress API
InetSocketAddress ( SocketAddress 的子类 )构造方法:
方法签名 方法说明
InetSocketAddress(InetAddress addr, int port) 创建一个Socket地址,包含IP地址和端口号
示例1:写一个简单的客户端服务程序,回显服务(EchoSever)
在这里插入描述
构建Socket对象有很多失败的可能:
端口号已经被占用,同一个主机的两个程序不能有相同的端口号(这就好比两个人不能拥有相同的电话号码);
此处,多个进程不能绑定同一个端口号,但是一个进程可以绑定多个端口,(这就好比一个人可以拥有多个手机号),一个进程可以创建多个Socket对象,每个Socket都绑定自己的端口。
每个进程能够打开的文件个数是有上限的,如果进程之间已经打开了很多文件,就可能导致此时的Socket文件不能顺利打开;
在这里插入描述
这个长度不一定是1024,假设这里的UDP数据最长是1024,实际的数据可能不够1024
在这里插入描述
这里的参数不再是一个空的字节数组了,response是刚才根据请求计算的得到的响应,是非空的,DatagramPacket 里面的数据就是String response的数据。
responsegetBytes()length:这里拿到的是字节数组的长度(字节的个数),而responselength得到的是字符的长度。
五元组
一次通信是由5个核心信息描述的:源IP、 源端口、 目的IP、 目的端口、 协议类型。
站在客户端角度:
源IP:本机IP;
源端口:系统分配的端口;
目的IP:服务器的IP;
目的端口:服务器的端口;
协议类型:TCP;
站在服务器的角度:
源IP:服务器程序本机的IP;
源端口:服务器绑定的端口(此处手动指定了9090);
目的IP:包含在收到的数据报中(客户端的IP);
目的端口:包含在收到的数据报中(客户端的端口);
协议类型:UDP;
1.启动读写器
启动电脑,打开RFID实验箱,取出高频读写器用USB连接线连接电脑。在电脑上打开读写器演示软件YX7036DemoCNexe,进入主界面,打开端口。
2.读取lSO14443A协议卡片信息
1)将读写器演示软件选项切换到lSO14443A协议(图2-1中1),点击“切换到lSO14443A模式”(图2-1中2),点击“打开射频”(图2-1中3),此时高频读写器正式进入lSO14443A读写准备状态。
2)点击“Request”(图2-1中4),此时卡类型即显示在右边(图2-1中12),执行Request命令后,若射频场中有ISO14443A标签存在,“卡类型”文本框将会显示该标签的类型代码;否则,状态栏提示“无ISO14443A电子标签可 *** 作”。由于该命令执行的是Request(All),处于任何状态的标签均会应答;如果调用Request(Idle),则只有处于Halt状态之外的标签才能应答。
3)点击“Anticoll”(图2-1中5),Mifare One 防冲突获取射频场中一张Mifare One标签的UID,如果防冲突执行成功,“卡号”文本框将会显示获取到的4字节标签UID(图2-1中13);否则状态栏显示“防冲突失败”。ULAnticoll: UltraLight 防冲突:获取射频场中一张UltraLight标签的UID,如果防冲突执行成功,“卡号”文本框将会显示获取到的7字节标签UID;否则状态栏显示防冲突失败。
4)点击“Select”(图2-1中6),选择指定UID的标签,以后的所有 *** 作均针对该标签。如果选择成功,“卡容量大小”文本框会显示标签存储区的大小(图2-1中14)。注意:UltraLight标签无需执行该命令,在ULAnticoll过程中已经进行了Select *** 作。
图2-1
3.读写lSO14443A协议卡片数据
对lSO14443A协议卡片数据进行读写之前先要对电子标签进行证实 *** 作,点击“AuthKey”(图2-1中8) *** 作会读取“读写”框中的密钥,用指定的密钥类型证实所选的扇区。如果填写的密钥与标签扇区上的密钥匹配,则证实成功,状态栏显示“AuthKey:执行成功”。认证成功后,就可以对数据区的内容进行读取或修改了。选择扇区号(图2-1中15),选择块号(图2-1中16),点击“Read”(图2-1中17),成功则在数控块中看到所 *** 作的数据块数据(图2-1中19)。在数据块框中(图2-1中19)输入需要写入数据块的数据,点击“Write”(图2-1中18),成功即在左下角显示“Write执行成功”。
注意:
1 Mifare one S50(共16个扇区)
块0~块2为数据块;块3为密钥块
Mifare one S70(共40个扇区)
当扇区号<=31时,块0~块2为数据块;块3为密钥块;
当扇区号>31时,块0~块14为数据块;块15为密钥块
2要写入数据时,数据的长度必须为16个字节
3读UltraLight标签时,请将扇区号设为0,块号即为UltraLight标签对应的页号读取的内容是从选择的页号开始的连续4个页
4写UltraLight标签时,只有低四个字节能被写入标签,余下的12个字节为0;
另外,有专用于UltraLight标签的写命令ULWrite,
知识学习
S50卡有lk bytes共16个扇区,每个扇区有4个块,其中第1扇区第块是卡序列号,是只读的,不能写。密钥存放在每个扇区的块3。算存储密钥块的算法是:x=s4+3:其中s表示扇区号(0-15)。
1、Ml卡分为16个扇区,每个扇区由4块(块O、块l、块2、块3)组成,(也将16个扇区的64个块按绝对地址编号为0-63)。
2、第0扇区的块0(即绝对地址0块),它用于存放厂商代码,已经固化,不可更改。
3、每个扇区的块0、块1、块2为数据块,可用于存贮数据。
数据块可作两种应用:
★用作一般的数据保存,可以进行读、写 *** 作。
★用作数据值,可以进行初始化值、加值、减值、读值 *** 作。
4、每个扇区的块3为控制块,包括了密钥A、存取控制、密钥B。具体结构为:密钥A(6字节) 存取控制(4字节)密钥B(6字节)
1.启动读写器
启动电脑,打开RFID实验箱,取出高频读写器用USB连接线连接电脑。在电脑上打开读写器演示软件YX7036DemoCNexe,进入主界面,打开端口。
2.读取lSO14443A协议卡片密匙
依次点击图3-1中1-7(具体见实验二),选择块号3(图3-1中8),点击“Read”(图3-1中9),就会看见下面密匙块显示框中显示密匙为:000000000000 FF078069 FFFFFFFFFFFF(图3-1中10)。其中密码A(6字节) 存取控制(4字节) 密码B(6字节)。密匙相关知识见后资料。
图3-1
3.修改lSO14443A协议卡片密匙
依次点击图3-1中1-7(具体见实验二),选择块号3(图3-1中8),点击“Read”(图3-1中9),就会看见下面密匙块显示框中显示密匙为:000000000000 FF078069 FFFFFFFFFFFF(图3-1中10)。在修改密匙中选择新密匙B(图3-2中1),在新密匙输入框中输入新密匙“222222222222”(图3-2中2),点击“修改密匙”(图3-2中3),修改成功可以在左下角看到“修改密匙”执行成功,选择密匙所在的块号3(图3-2中4),点击“Read”(图3-2中5)。可以看到新密匙已经修改成功(图3- 3)
4MF1卡修改各区块控制位值和数据
(一),以常用设置"08 77 8F 69"控制条件为例,先搞清楚它――具有的访问权限。
1、对"08 77 8F 69"值进行计算,该值定位于各区块3的6,7,8,9四个字节内,字节6=08,字节7=77,
字节8=8F,字节9=69(默认值,不予计算)。
2、例如:字节6=08,对应其二进制值=00001000, 则对6,7,8这三个字节进行二进制转换结果见下表:
4、对以上6,7,8字节的存取/控制二进制已取反值,依照表2,表4块位转换为各块控制值,如下表:
注意: 高4位的各块值=低4位的各块值时,其值可用。高4位值≠低4位值时,其值不可用!
5、查对访问权限(数据存取控制依照表3,块3存取控制依照表5),该例"08 77 8F 69"的访问权限为:
◆ 块3 = 011:权限为:KeyA,KeyB均不可读,验证KeyB正确后可改写KeyA和KeyB,验证KeyA或KeyB正确后可读"控制位"。在此可见密钥KeyB的重要性,KeyB不正确是无法看到块3控制值,更无法修改密钥。
◆ 块2 = 块1 = 块0 = 110:权限为:验证KeyA或KeyB后可读该块数据,减值以及初始化值,只有验证KeyB 正确后才可改写该块数据,在此可以看到密钥KeyB对改写数据块也起着关键性作用。
(二)、"08 77 8F 69" 控制条件设置步骤:
由(一)可知:KeyB设置后为不可读,并且改写数据和改写控制位都需要正确验证它,故KeyB设置后程序
*** 作员必须妥善保管KeyB值,否则以后改写数据和控制位时,不正确的KeyB值将无法实现卡的任何 *** 作!!!
1、修改块3控制位的值:最初的各区块3内的KeyA,KeyB都是厂商12个"F"默认值(KeyA在任何条件下均为不可读,大部分读写机程序表现KeyA为未知的12个"0" ),在修改控制值时,先不要修改默认密码KeyA和KeyB,在控制位修改成功后,再去更改新密码值。即先对块3的控制位进行修改(默认值FF 07 80 69改为新值08 77 8F69)并执行写 *** 作。控制位写成功后,KeyB亦为12个"0"不可读了,但仍是隐藏的12个"f"默认值。
2、修改块3的KeyA和KeyB值:控制位08 77 8F 69值写成功后,验证KeyB正确后方可改写KeyA和KeyB新密码。在密码 *** 作模式键入要改写区块之先前密码B(先前密码为默认值时,则不需改动和加载),加载后反回数据 *** 作模式,再进行读值,KeyA和KeyB值的改写。
3、修改块0~块2中数据:由新的控制条件08778F69可知,要修改数据,必须先验证KeyB,故先设置密码 *** 作为KeyB认证方式,加载后再返回数据 *** 作模式,对要修改的数据块进行值的改写 *** 作。
4、上例中分析了"08 77 8F 69"的访问条件及其改写步骤,对用户的其它控制条件亦可参照应用。
MF1卡常见问题及处理建议
① 盲目 *** 作:造成某些区块误 *** 作被锁死不能再使用。应当仔细参考表3表5的控制权限后,予先得出 *** 作后的结果是否适合使用要求,并且列出 *** 作顺序表单再 *** 作。最好授权程序员对块3的设置作专人 *** 作。
② 丢失密码:再读写时造成密码认证出错而不能访问卡。特别要求在对MF卡进行块3编程 *** 作时,必须及时记录相关卡号的控制值,KeyA,KeyB等,而且应当有专人管理密码档案。
③错误设置:对MF1卡的块3控制块了解不透彻,错误的理解造成设置造成错误的设置。依照表2可知,目前Mf1卡的控制块仅只有8种数据块访问控制权限和8种控制块设置权限,超出这16种权限的其他代码组合,将直接引起错误设置而使卡片报废!
④ 极端权限:当块3的存取控制位C13C23 C33 = 110或者111时,称为极端权限。除特殊应用外一般不被使用!启用前认真权衡对密码读写,存取控制的锁死是否必要,否则,数据加密后即使有密码也无法读取被锁死的数据区块(看不见)!
⑤ 设备低劣:低劣的设备将直接影响卡的读写性能。对MF卡进行块3编程 *** 作的设备,特别要求其性能必须十分可靠,运行十分稳定!建议选用由飞利浦公司原装读写模块构建的知名读写机具!
⑥编程干扰:在对块3进行编程 *** 作时,不可以有任何的"IO"中断或打扰!包括同时运行两个以上程序干扰甚至PC机不良的开关电源纹波干扰等,否则,不成功的写 *** 作将造成某个扇区被锁死的现象,致使该扇区再次访问时出错而报废。
⑦ 数据出错:在临界距离点上读卡和写卡造成的。通常的读卡,特别是写卡,应该避免在临界状态(刚能读卡的距离)读卡。因为临界状态下的数据传送是很不稳定的!容易引起读写出错!
⑧ 人为失误:例如,密码加载 *** 作失误,误将KeyA加载为KeyB;或者是误将其他制卡厂约定的初始密码值如a0a1a2a3a4a5,b0b1b2b3b4b5加载到本公司生产的MF1卡内;或者在初始状态下(密码A=000000000000隐藏状态,实际为ffffffffffff,控制位=FF 07 80 69,密码B=ffffffffffff可见)若不经意地将KeyA=000000000000 删除后又重新输入12个"0",并加载了它!这时无意中已将KeyA原来12个隐藏的"f",修改成了12个"0",其后果可想而知!
⑨ 卡片失效:读写均无数据传送,读写器报告"寻卡错误"!卡片被超标扭曲,弯曲而造成内电路断裂。
⑩ 读写距离过近:与用户使用的读写器性能有关。标准型MF1卡的读写距离可达250px(在飞利浦公司的标准读写机具上测试的最大距离),国产知名品牌读写器一般可达5-250px。尺寸较小的匙扣卡,其读写距离当然比标准卡近许多,但只要可靠的读写距离≥5~10mm以上,一般不会影响正常使用!
>>>>要完整的实在太多了 还不明白找我
MSComm 作为一个串行通讯控件为程序员串口通讯编程节省了很多时间。在基于对话框的应用中加入一个MSComm控件非常简单。只需进行以下 *** 作即可:
打开“Project->Add To Project->Components and Controls->Registered Activex Controls”(工程/部件/控件),然后选择控件:Microsoft Communication Control,version 60(Microsoft Comm Control 60)插入到当前的工程中。这样就将类 CMSComm 的相关文件 mscommcpp 和 mscommh 一并加入到了工程中。编程时只需将控件对话中的 MSComm 控件拖至你的应用对话框中就OK了。
以上就是关于三菱plc用modbusrtu协议读取从站1的40001地址怎么写全部的内容,包括:三菱plc用modbusrtu协议读取从站1的40001地址怎么写、usbhid协议读写sd卡、工业通信协议如modbus如何具体使用呢是否依赖一定的硬件,还是根据协议直接编程实现数据读写等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)