有“贝”而“莱” 强势围观 | 贝加莱MODBUS通信知识详解 030

2021-11-05 15:26:51 浏览数 (1)

JZGKCHINA

工控技术分享平台

尊重原创 勿抄袭

勿私放其他平台

原创投稿

030

贝加莱MODBUS通信知识详解

王胜利

一、贝加莱MODBUS通讯功能块介绍

打开贝加莱的帮助文档,搜索DRV_MBUS,可以找到DRV_MBUS库。

在上图中,可看到与MODBUS通讯相关的功能块,与主站相关的功能块有4个,与从站相关的功能块有3个。贝加莱作为主站时主要用到以下功能块。

a.MBMOPEN()

MBMOPEN()功能块打开(激活)主站通讯接口。参数如下

I/O 参数 含义

I enable 功能块使能

I PDEVICE 通讯接口的名称

I PMODE 通讯接口参数设置

I PCONFIG 数据块的名称

I timeout 通讯超时参数

I ascii MODBUS模式,(0=RTU/1=ASCII)

O status 错误代码,0表示无错误

O IDENT 提供给MBMaster(),MBMCmd(),MBMClose()用的句柄

b.MBMaster()

I/O 参数 含义

I enable 功能块使能

I ident 从MBMOpen()返回的句柄指针

O status 错误代码,0表示无错误

O execute 命令是否执行

O recordnum 当前数据交换的次数

c.MBMCmd()

I/O 参数 含义

I enable 功能块使能

I ident 从MBMOpen()返回的句柄指针

I mfc Modbus功能码

I node 从站站点号,0为广播

I data 数据区域首地址

I offset 偏移量

I len 数据长度

O status 错误代码,0表示无错误

d.MBMClose()

关闭主站通讯接口

I/O 参数 含义

I enable 功能块使能

I ident 从MBMOpen()返回的句柄指针

O status 错误代码,0表示无错误

二、硬件链接

要实现PLC与电脑的Modbus通讯,需要一根USB转485的串口线,打开贝加莱的帮助文档,搜索cs1030,打开通讯模块cs1030的帮助文档,查看cs1030的引脚定义如下,我采用的是RS485模式,cs1030同时支持RS422模式。

将DATA连接T/R DATA/连接T/R- GND连接VCC

三、贝加莱PLC作为主站的配置过程

a.建立一个通讯变量配置模块(dataobject)

新建工程,添加一个dataobject,在dataobject中添加以下内容。

"EventPV1 ", 01,$01, "LocalPV1 ", 0000, 0005 "EventPV2 ", 02, $01, "LocalPV2 ", 0000, 0003 "EventPV3 ", 03, $01, "LocalPV3 ", 0000, 0005 "EventPV4 ", 04, $01, "LocalPV4 ", 0000, 0005

注:

“EventPV1 “, 01, 01, “LocalPV1 “, 0000, 0005这条语句当中,01为功能码,读取线圈继电器的状态,01为从站站点号,”LocalPV1”表示读取的数据存放地址为LocalPV1,0000为读取的线圈继电器首地址,0005为读取长度。EventPV1是发出指令的使能信号,为1时,主站向从站发出指令。因此,整条语句的含义就是,在通讯过程中,当EventPV1等于1时,主站向从站01发出指令读取继电器线圈0000到0004的状态并存储到LocalPV1当中。此时发出的报文为010100000005FC09,FC09是校验和。其他几条指令与此含义类似。

b.全局变量

定义在上一步通讯变量配置过程中,用到了EventPV1~EventPV4和LocalPV1~LocalPV4等变量。这几个变量必须定义为全局变量。我曾在此犯过错误,折腾了很长时间。定义如下:

Name DataType Scope

EventPV1 bool global

EventPV2 bool global

EventPV3 bool global

EventPV4 bool global

LocalPV1 bool[5] global

LocalPV2 bool[3] global

LocalPV3 int[5] global

LocalPV4 int[5] global

c.通讯功能块

配置新建一个program,改名为master.st,定义变量和功能块如下:

Name DataType Scope

MBMOpen_xx MBMOpen local

MBMaster_xx MBMaster local

MBMCmd_xx MBMCmd local

MBMClose_xx MBMClose local

S1 bool local

S2 bool local

打开init.st,初始化并配置MBMOpen_xx()功能块

代码语言:javascript复制
  PROGRAM _INIT
    (* Insert code here *)
    S1:=0;
    S2:=1;

    EventPV1 := 1;
    EventPV2 := 1;
    EventPV3 := 1;
    EventPV4 := 1;

    LocalPV1[0] :=0;
    LocalPV1[1] := 0;
    LocalPV1[2] := 0;
    LocalPV1[3] := 0;
    LocalPV1[4] := 0;

    LocalPV2[0] :=0;
    LocalPV2[1] := 0;
    LocalPV2[2] := 0;


    LocalPV3[0] := 0;
    LocalPV3[1] := 0;
    LocalPV3[2] := 0;
    LocalPV3[3] := 0;
    LocalPV3[4] := 0;

    LocalPV4[0] :=0;
    LocalPV4[1] := 0;
    LocalPV4[2] := 0;
    LocalPV4[3] := 0;
    LocalPV4[4] := 0;   

    MBMOpen_xx.enable:=1;
    MBMOpen_xx.pDevice:=ADR('IF6.ST4.IF1');
    MBMOpen_xx.pMode:=ADR('/PHY=RS485 /PA=E /DB=8 /SB=1 /BD=19200');
    MBMOpen_xx.pConfig:=ADR('dataobject');
    MBMOpen_xx.timeout:=2000;
    MBMOpen_xx.ascii:=0;
    MBMOpen_xx();    
END_PROGRAM

四、调试

a.程序编写完成后,即可编译下载到PLC中运行,打开电脑上Modbus Slave软件。

注意工具栏上有connect和disconcert的图标,第一次使用不要直接点击connect的图标连接,因为我们需要先配置模式,我曾经在这里犯过错误,直接按照默认的模式connect,结果死活连接不成功,在这里纠结了好久。这种低级错误实在是不该犯,浪费时间。

b.点击connection->connect进入connection配置界面

选择相应的串口(在设备管理器中查看,此处为port6)

设置波特率为:19200

数据位:8位

校验:偶校验(之前连接不成功的原因就是校验方式选为了NONE)

停止位:1位

mode:RTU

设置完成后,点击OK即可连上。

c.从站定义点击setup->slavedefinition进入从站定义界面

salve:输入1,这是从站站点号

Function:选择要操作的寄存器

代码 寄存器

01 coil status

02 input status

03 holding register

04 input register

adddress:首地址

length:长度在这里我们先将做如下设置

salve:1

Function:03 holding register

Address:1

Length:10

d.通讯检测在AS中打开watch窗口(CTRL M).添加变量EventPV1~EventPV4,

MBMOpen(),MBMCmd(),MBMClose(),MBMaster(),LocalPV1~LocalPV4,S1,S2.

在Modbus Slave中双击40001打开Edit Register界面

在value中写1,同时勾选Auto increment,点击OK

在AS的watch窗口将EventPV3的值改为1

可以看到localPV3[0]的值随着salve中40001的值在递增,说明通讯正常。

END

0 人点赞