汇川Easy501 PLC使用IO口用ST代码实现通讯点对点通讯

360影视 日韩动漫 2025-04-09 09:13 3

摘要:汇川Easy系列全场景紧凑型小型控制器全系列8个机型,满足用户对小型自动化设备各种需求,适用于严苛体积、多轴运控、温度控制、通信组网等场景。机身模块化设计,支持扩展卡和模块扩展,精准适配各类场合,完美适配特定需求,避免资源浪费。本地集成多种工业网络通信协议,轻

一.前言

汇川Easy系列全场景紧凑型小型控制器全系列8个机型,满足用户对小型自动化设备各种需求,适用于严苛体积、多轴运控、温度控制、通信组网等场景。机身模块化设计,支持扩展卡和模块扩展,精准适配各类场合,完美适配特定需求,避免资源浪费。本地集成多种工业网络通信协议,轻松对接数据采集系统和周边设备。完全自主化的编程软件,持续迭代易用性功能,符合工程师应用习惯,更易用。 “易”如反掌,应“景”而生,革新的设计理念,来源于真实的使用场景,来源于真实的用户“痛点”。
常用型号:

Easy320-0808TN
Easy301-0808TN
Easy302-0808TN
Easy502-0808TN
Easy501-0808TN
Easy522-0808TN
Easy521-0808TN
Easy523-0808TN

要是晶体管输出的 PLC 之间的通讯口不够用,那可以琢磨用 IO 口来弄个点对点通讯。我之前就瞅见过一种第三方西门子 200 的 IO 拓展模块,就是通过这种办法跟 CPU 主机连上的。不过呢,现在技术变得更厉害啦,第三方拓展模块都能直接跟原机拓展接口兼容喽。

1.1 优点

当 PLC 的 IO 拿来通讯的时候,就用不着通讯专用模块啦,也不用为了用编程口,特别是像 OMRON 那种不公开协议的而闹心。IO 口随便指定,而且对 PLC 互联的品牌没啥要求,星型外接的数量想加多少加多少。

1.2 局限

PLC 因为扫描周期比较长,所以通讯速度就有限。要是成本能行或者数据流量大的情况,那还是得用 PLC 厂商各自给出的通讯办法。要是那种继电器输出的 PLC,因为通讯得高速切换输出,可千万别用这个法子,要不然 PLC 很快就会坏掉。

二.IO 通讯原理

串行通讯呢,就是按照时间顺序送出一串由 0 和 1 组成的编码。接收的一方得做好同步,这样才能正确接收和理解这些编码,然后完成通讯。PLC 因为扫描周期长,定时也不那么精确,所以不太适合用时间同步的办法。数据传输除了要有一根数据线,还得有一根同步信号线,这根线是用来告诉发送方新数据已经收到啦,如果没有这根线,就分不清连续发送的 00……或者 11……这些数据。

2.1. PLC-PLC
2.1.1. 双向(2 - 2 线)

拿发送 4 位数据来举个例子,在这个例子里,A、B 机的 Q0.1 口当作数据口,Q0.0 口当作同步口。A 机是主机,要发送 1001(也就是 9),从机 B 要发送 0101(也就是 5),先从低位开始发。

A 机发送启动同步,A - Q0.0 = 1;B 收到同步后,也响应发送同步,B - Q0.0 = 1;A 机收到 B 机的同步响应后,发送数据,A - Q0.1 = 1,并且交变同步,A - Q0.0 = 0;B 机收到 A 机的同步交变,记录数据 A0 = 1,然后发送数据,B - Q0.1 = 1,同时交变同步,B - Q0.0 = 0;A 机收到 B 机的同步交变,记录数据 B0 = 1,接着发送数据,A - Q0.1 = 0,同时交变同步,A - Q0.0 = 1;跟 4 一样,B 机记录数据 A1 = 0,发送 0,并且交变 B - Q0.0 = 1;A 机记录数据 B1 = 0,发送 0,并且交变 A - Q0.0 = 0;一直到 10)都是这样,A 机发送 A2 = 0,A3 = 1,B 机发送 B2 = 1,B3 = 0;A 机交变同步,完成通讯;B 机收到 A 完成的信号,也交变同步,结束通讯。

这种方法通讯 2 个周期传 1 位,速度还算快,不过通讯的帧间隔得用一定的延时来保证后面帧的同步,要是一直不停地发,就没法确定当前传输的数据位号啦。通讯的同步信号设计应该偶数次交变,这样能回到初始的状态。可以不要起始信号,第一次就发数据和同步信号,但是一定要有结束同步,要不然最后 1 位收完了,对方机器不知道,就会一直在那多余地等着。编程的时候要注意,因为 PLC 的 2 个输出不会严格同步,得先把数据位弄好,再交变同步,免得对方收错了。

2.1.2. 单向(1 - 2 线)

单向通讯比双向的简单些,接收机只要交变送出确认信号就行啦,所以发送机需要 2 个输出、1 个输入,接收机就反过来。这种方法也是 2 个周期传 1 位的速度。

2.2. 快慢机通讯

因为 PLC 速度比较慢(是 10ms 级别的),要是外接那种速度很快的数据设备(像 MCU、DSP 这些是 μs 级别的),那就可以只用更少的输入和输出来完成通讯过程。原理是 PLC 一发送出去,到下一个扫描周期的时候,对方早就收到并且准备好了新数据,这样就不用去确认对方是不是收到了,所以 PLC 每次扫描发出交变确认信号的时候都能收到一个新数据,步骤省了,通讯速度也提高了。PLC 发出交变同步是为了让接收机能分辨出发送的位。

2.2.1. 双向协议(1 - 2 线)

PLC 用 1 个输入和 2 个输出,PLC 先接收对方的数据,再用两个输出表示同步和数据,在下一个扫描周期也是先接收,然后再发送数据和交变同步,每个周期交换 1 位数据。

2.2.2 单向协议(1 - 1 线)

PLC 当作接收机,比如说接收 2 位数据的过程是这样的:

只用 1 - 1 线是没办法实现快慢机双向通讯的。

三.双向(2 - 2 线)PLC 程序实现

硬件用的是汇川 Easy501 PLC,编程软件用的是汇川 AutoShop,是用 ST 语言来编写的。这个程序的功能是让 A 机和 B 机之间能发送和接收两个字节的数据。

A机程序

//IO通讯程序_A机

CASE iASteps OF

K0://建立同步,建立成功后A同步为1

yASendSyncPort := TRUE;

IF xARecvSyncPort THEN

d1 := K0;

D0 := iASendWord;

iASteps := iASteps + K1;

END_IF;

K1://发送第一个位

yASendDataPort := D0.0;

yASendSyncPort := FALSE;

IF NOT xARecvSyncPort THEN

D1.0 := xARecvDataPort;

END_IF;

K2://发送第二个位

yASendDataPort := D0.1;

D1.1 := xARecvDataPort;

END_IF;

K3:

yASendDataPort := D0.2;

D1.2 := xARecvDataPort;

END_IF;

K4:

yASendDataPort := D0.3;

D1.3 := xARecvDataPort;

END_IF;

K5:

yASendDataPort := D0.4;

D1.4 := xARecvDataPort;

END_IF;

K6:

yASendDataPort := D0.5;

D1.5 := xARecvDataPort;

END_IF;

K7:

yASendDataPort := D0.6;

D1.6 := xARecvDataPort;

END_IF;

K8:

yASendDataPort := D0.7;

D1.7 := xARecvDataPort;

END_IF;

K9:

yASendDataPort := D0.8;

D1.8 := xARecvDataPort;

END_IF;

K10:

yASendDataPort := D0.9;

D1.9 := xARecvDataPort;

END_IF;

K11:

yASendDataPort := D0.10;

D1.10 := xARecvDataPort;

END_IF;

K12:

yASendDataPort := D0.11;

D1.11 := xARecvDataPort;

END_IF;

K13:

yASendDataPort := D0.12;

D1.12 := xARecvDataPort;

END_IF;

K14:

yASendDataPort := D0.13;

D1.13 := xARecvDataPort;

END_IF;

K15:

yASendDataPort := D0.14;

D1.14 := xARecvDataPort;

END_IF;

K16:

yASendDataPort := D0.15;

D1.15 := xARecvDataPort;

END_IF;

K17://开始下一轮通讯

iARecvWord := d1;

iASteps := K0;

END_IF;

ELSE

;

END_CASE;

//IO映射

Y0 := yASendSyncPort;

Y1 := yASendDataPort;

xARecvSyncPort := X0;

xARecvDataPort := X1;

B机程序

//IO通讯程序_B机

CASE iBSteps OF

K0://建立同步,建立成功后B同步为1

IF xBRecvSyncPort THEN

yBSendSyncPort := TRUE;

D1 := K0;

D0 := iBSendWord;

iBSteps := iBSteps + K1;

END_IF;

K1://等待A机同步信号为0,开始接收数据,并交变B机同步信号

IF NOT xBRecvSyncPort THEN

D1.0 := xBRecvDataPort;

yBSendDataPort := D0.0;

yBSendSyncPort := FALSE;

END_IF;

K2://接收第二个位

yBSendDataPort := D0.1;

D1.1 := xBRecvDataPort;

END_IF;

K3:

yBSendDataPort := D0.2;

D1.2 := xBRecvDataPort;

END_IF;

K4:

yBSendDataPort := D0.3;

D1.3 := xBRecvDataPort;

END_IF;

K5:

yBSendDataPort := D0.4;

D1.4 := xBRecvDataPort;

END_IF;

K6:

yBSendDataPort := D0.5;

D1.5 := xBRecvDataPort;

END_IF;

K7:

yBSendDataPort := D0.6;

D1.6 := xBRecvDataPort;

END_IF;

K8:

yBSendDataPort := D0.7;

D1.7 := xBRecvDataPort;

END_IF;

K9:

yBSendDataPort := D0.8;

D1.8 := xBRecvDataPort;

END_IF;

K10:

yBSendDataPort := D0.9;

D1.9 := xBRecvDataPort;

END_IF;

K11:

yBSendDataPort := D0.10;

D1.10 := xBRecvDataPort;

END_IF;

K12:

yBSendDataPort := D0.11;

D1.11 := xBRecvDataPort;

来源:PLC技术玩一点号

相关推荐