最近在使用台达的PLC,稍作记录
台达官网:delta-china.com.cn
威纶通:weinview.cn
部份链接:
基于Modbus_TCP协议台达PLC与上位机VB软件之间的通信
AS系列PLC是台达定位中小型的PLC。个人主推:AS228T-A/AS228P-A/AS228R-A,其中的TPR分别表示NPN/PNP/继电器输出。
AS228T-A PLC*1 输出Y0.0-Y0.11 输入X0.0-X0.15
AS16AM10N-A 16输入模块*1 输入X1.0-X1.15
AS16AN01T-A 16输出模块*2 输出Y1.0-Y1.15 Y2.0-Y2.15
AS-FCOPM CANOpen通讯介界扩充卡
AS00SCM-A 串口通讯/CANOpen通讯扩充模块
ISPSoft阅读记录
COMMGR 通讯管理工具.软硬件桥梁
VAR 普通变量
VAR_RETAIN 停电保持变量
VAR_INPUT
VAR_OUTPUT
VAR_IN_OUT
BOOL(1) BYTE(8) WORD(16) DWORD(32) LWORD(64)
SINT(8) INT(16) DINT(32) LINT(64)
USINT UINT UDINT ULINT
REAL(32) LREAL(64)
STRING(8)
TIME T#0ms
DATE D#1970-01-01
TOD TOD#00:00:00-23:59:59.999ms
DT DT#1970-01-01 0:0:0
变址寄存器 VAR_0@E0 变量VAR_0的地址,偏移E0变量的数值地址(地址偏移)
指针型变量用于传地址给功能块,让其直接修改数据,以p开头
(* *) 行批注,关键字不区分大小写
16#5BA 16进制
8#453 8进制
2#01011 2进制
M0:=(D0=32); 判断D0是否为32,再将其真假值赋给M0
Page584,几种错误赋值
IF ... THEN
ELSEIF ... THEN
ELSE
END_IF;
CASE ... OF
ELSE
END_CASE;
REPEAT
UNTIL
END_REPEAT;
WHILE ... DO
END_WHILE;
FOR ... TO ... BY ... DO
END_FOR;
API(...); Page593 ST中的API无法操作En端点。若使用定时器TMR时,要程序中重置定时器。
RETUREN; EXIT;
现在的问题:
1.PLC程序的模块化
2.PLC与步进电机的驱动(现通过CANopen协议)
3.PLC与控制器HMI的无线通信
ASCII通讯模式实现台达PLC与PC机的通讯
ASCII通讯格式:地址1位+功能1位+数据1-32位+校验码1位+回车键
地址:01-FF
功能:01 读多个S.Y.M.T.C的状态
02 读取S.Y.M.T.C输入状态
03 读取D.T.C寄存器的值
05 强制使S.Y.M.T.C置位或复位 数据内容FF00置位 0000复位
06 向PLC的D.T.C寄存器写值
LRC校验码:
例: 01 03 04 01 00 01
地址01 功能03 数据 04 01 00 01
1. 01 + 03 + 04 + 01 + 00 + 01 = 0A
2. 将0A的值转换为2进制的补数F6
3. 补数的求法: 0A(H)=0000 1010(B)
取反为: 1111 0101(B)
加1:1111 0110(B)
即补数为: F6(H)
辅助继电器M0操作:
1)置位M0:
01 05 08 00 FF 00 F3
地址:01
功能:05
继电器地址:08 00
数据:FF 00 (置位)
校验:F3
2) 复位M0:
01 05 08 00 00 00 F2
对文件寄存器D512操作:
1)向D512写入一个十进制:如把D512设定为32,32转换为十六进制为0020,1200表示D512的地址
01 06 12 00 00 20 E6
2)读取PLC的D512值:01 03 12 00 00 01 E9
00 01 表示读取1个寄存器的值
00 02 表示读取2个寄存器的值
PC向PLC发送字符串指令:010312000001E9
PLC向PC返回:01030204B046
02表示返回值字节总数2(1个寄存器的字节数为2),04B0表示目标寄存器D512的内容为04B0(H),46为检验码
AS系列程序手册
继电器及寄存器
(P2-5) PLC的执行方式:读取外部输入信号状态–执行程序,修改输出状态–执行输出状态。
所以:
- 在程序执行期间不会再次获取输入状态。
- 程序执行完后,统一修改输出状态。则在程序中各个输出状态,以最后状态为准,过程状态并不体现。
位Bit 位数4Bit 字节Byte(8Bit) 字符Word(16Bit) 双字DWord(32Bit)
辅助继电器M/数据寄存器D:可用于停电保持 特殊辅助继电器SM:用于系统内部信息获取 P2-11 SM信息表 变址寄存器E:主要用于相对寻址,E0-E9 文件寄存器FR:供用户储存大量参数数据
P4-4 脉冲执行型:当En为上升沿触发,指令执行一次 连续执行型:当En为ON时,每个扫描周期都执行一次
P5-7 MC与MCR: 当En时,MC与MCR中间程序执行,否则不执行。有点类似于执行程序块
P5-18 NP 上升沿触发指令:当所有条件均为ON时,进行一次触发
P6-25 CMP 比较设定输出:如果S1>S2,D=ON;如果S1=S2,D+1=ON;如果S1<S2,D+2=ON ZCP 区域比较
P6-136 CJ 条件跳转 JMP 无条件跳转 GOEND 跳转到END
P6-155 REF I/O更新处理 DHSRF 高速比较值立即刷新 REFF 更新输入点滤波时间
P6-163 ALT ALTP ON/OFF交替
P6-178 PIDE PID运算
P6-227 ROR 右循环 RCR 带进位标志右循环 ROL 左循环 RCL 带进位标志左循环
P6-239 RST 接点或寄存器清除 TMR 16位定时器100ms TMRH 16位定时器1ms CNT 16位计数器 TMRM 16位定时器10ms
P6-473 CRC 检查CRC模式 MODRW(S1,S2,S3,S,n) MODBUS数据读写 S1 设备地址(0-254 0为广播) S2 功能码 S3 数据地址 S 读写数据存放地址 n 读写长度
S2 为功能码
01 读取Bit X.Y.M.SM.S.T.C.HC
02 读取多Bit X.Y.M.SM.S.T.C.HC
03 读取多Word X.Y.SR.D.T.C.HC.E
04 读取多Word X
05 单Bit写 Y.M.SM.S.T.C.HC
06 单Word写 Y.SR.D.T.C.HC.E
0F 多Bit写 Y.M.SM.S.T.C.HC
10 多Word写 Y.SR.D.T.C.HC.E
P6-500 COMDF 串行通讯端口通讯格式设定指令
P6-519 MODRWE MODBUS直接指定通讯端口通讯指令
P6-527 CANRS CAN自定义通讯传送与接收指令 S1:通讯模式 S2:通讯ID S3:传送长度 S4:传送来源起始位置 D1: 接收储存起始位置 D2: 通讯完成标志 D3: 能讯错误标志
P6-541 DELAY 延迟指令0.1ms
P6-545 EPUSH 变址寄存器存入 将E0-E9的内容值存放到D的内容所指定装置 EPOP 变址寄存器读出 与上相反
P6-549 INFO 系统讯息读出
P6-551 字符串处理指令 $LEN 字符串长度 $FSTR Float->String $FVAL String->Float $RIGHT 右取字符串 $LEFT 左取字符串 $MIDR 区段获取字符串 $SER 字符串搜寻 $RPLC 字符串替换 $DEL 字符串删除 $CLR 字符串清除 SPLIT 字符串分离 MERGE 字符串合并
P6-601 SOPEN(S1,S2,S3)打开Socket通讯 S1 =1 开启TCP Socket; =0 开启UDP Socket S2 Socket编号(最多4个:1-4) S3 =1 PLC为客户端; =0 PLC为服务端(当S1=0,即UDP下无效)
SSEND(S1,S2)通过开启的Socket传送数据
S1 =1 TCP Socket; =0 UDP Socket
S2 Socket编号1-4
SCLOSE 关闭Socket
收发数据的地址,在硬件配置HWCONFIG-PLC-以太网进阶设置-通讯接口中设置,或SCONF中设置。默认为D0
P6-619 EIPRW EtherNet/IP读写通讯指令
SCONF TCP/UDP Socket参数设定
MCONF MODBUS TCP数据交换设定
P6-636 MWRIT 将PLC数据写入到储存卡 P6-641 MREAD 将数据从储存卡读取到PLC P6-646 MTWRIT 将文字写入到储存卡 P6-650 MEMW 文件寄存器FR写入 P6-651 MDEL 储存卡文件删除
P6-654 TKON / TKOFF 周期性任务启动关闭
P6-659 SFCRUN / SFCPSE / SFCSTP SFC启动停止
P6-666 高速输出指令
研控YSS60步进电机
** CANopen **
报文格式:
仲裁域11位(COB-ID)+数据域最大8位
COB-ID: 功能码4位(FunctionCode)+节点地址7位(Node-ID)
报文类型:
PDO 过程数据对象 : 无确认发送数据,1-8个字节数据
SDO 服务数据对象 :有确认,主要访问设备及配置
NMT 网络管理对象 0000 :主从结构,对从站进行状态控制
SYNC 同步报文 0001 :为网络提供基准时钟,以同步设备
EMCY 紧急事件 :向网络报告故障。报文占据8字节数据。 01错误码 2错误寄存器 34567错误信息
HeartBeat 心跳包? 1110
** EDS文件 ** CAN in AUTOMATION(CiA)组织定义的CANopen协议文件,用于集成时的设备识别。类似于Win的配置文件INF
我的话
-
CANopen用于与支持此协议的步进电机通信,对电机进行控制,有线,载于RS485之上
-
ModBus用于与HMI触摸屏通信,载于EtherNet之上,实现无线控制
-
配置研控步进电机步骤:
- 启动COMMGR,添加倍达PLC,默认192.168.1.5
- 新建工程,通讯设置,连接COMMGR上的PLC
- HWCONFIG进行设备配置:设置PLC->内建CAN通讯口->工作模式:CANopen DS301协议->通讯速率根据实际
- PLC点选右键->通讯软件->CANopen Builder
- 进入CANopen Builder软件中,工具->EDS操作,导入研控电机对应EDS文件(YSS60C是集成式电机,EDS文件官网下载)
- 选中PLC->点击在线->点击下载(到PLC)->断电重新连接(点击在线)->点击扫描,发现在线电机
- 双击电机,进行协议配置->下方"已配置的PDO"->双击查看Rx和Tx两类已配置的协议,根据需要添加删除
- 在PDO映射中,上方为提供的可选配置,下方为需要使用的协议。每组协议长度不超过8位,可以定义多组 在测试中,使用以下几组:
映射 | 控制字 | 功能 | 位数 — | — | — | — D25032 | 6040 | 控制字(初始化及控制) | 16 D25033 | 607A | 位置 | 32 D25035 | 60FF | 速度 | 32 D25037 | 6060 | 工作模式 | 8 D24032 | 6041 | 反馈状态 | 16 D24033 | 6064 | 反馈位置 | 32 D24035 | 606C | 反馈速度 | 32
备:1.位数涉及到取数据时使用的关键字可能为双字节DWORD
备:2.PDO映射意即:将寄存器与控制字对应,对寄存器赋值,即将对控制字加数据,从而控制设备。寄存器会根据配置变化
备:3.映射寄存器的不连续,因为数据位数据为32,将占据下一个寄存器来存放
备:4.因为部份控制占用8位,在取数据时比较麻烦,可以单独配置到一组协议或配置于某组协议的尾部
- 配置完成后,双击PLC,进入“节点列表配置” -> 将可用节点添加到节点列表,下方将出现对应的寄存器(用于指令操作)
- 若发现8位指令与16位交叉出现,需重新配置,避免取数据麻烦
- 关闭CANopen Builder,返回HWCONFIG,点击下载,将配置送到PLC
- 补充:CANopen在电机上使用了一组接口,CANL.CANH.GND,另一组CANL/CANH使用了61欧电阻短接(此电阻在电机中已附带,不需要另接物理电阻)。
-
通过CANopen控制步进电机中的Y输出端口
- 在CANopenBuilder中添加控制协议2030-C,即输出端口的批量控制。以及2004-0,即获取一组输出端口状态。然后获取对应的寄存器号。
- 将变量的0.1.2三位设置状态,即对应Y0.Y1.Y2控制
- 研控YSS60C电机支持PNP及NPN方式,我们测试的是将YCOM接负极,当Y=ON时,输出负电平信号。(可以这样认为:Y端口的ON/OFF只是形成导通,公共端口接地,测量时,需一端接正电,当Y=ON时,形成正负导通)
- Y端口不需要初始化设置(应该为默认值0)
- 端口需要手动OFF
-
今天测试TCP/UDP网络通信,以及ModBus与PC通信(10.25)
- 测试环境:PLC为从,PC为主,接收D2000,发送D1000。 PLC发送的信息,PC接收后高低互换位。(通过SWAP指令可以置反高低8位)
- 在Go中建立简单TCP Server,通过conn.Write([]byte(“Test”))可以发送字符串或者发送数据conn.Write([]byte{0x50,0x32,0x51,0xD0,0x38,0x10}) 均需高低8位置反
- TCP Server就随便抄了一个网上的用
package main
import (
"fmt"
"net"
)
func main() {
//fmt.Print([]byte("Test"))
listener, err := net.Listen("tcp", "0.0.0.0:20000")
if err != nil {
fmt.Printf("listen fail, err: %v\n", err)
return
}
for {
conn, err := listener.Accept()
if err != nil {
fmt.Printf("accept fail, err: %v\n", err)
continue
}
//create goroutine for each connect
go process(conn)
}
}
func process(conn net.Conn) {
defer conn.Close()
for {
var buf [128]byte
n, err := conn.Read(buf[:])
if err != nil {
fmt.Printf("read from connect failed, err: %v\n", err)
break
}
str := string(buf[:n])
fmt.Printf("receive from client, data: %v\n", str)
_, err = conn.Write([]byte{0x50,0x32,0x51,0xD0,0x38,0x10})
if err !=nil {
fmt.Printf("write failed, err: %v\n", err)
break
}
}
}
4. UDP Server 同上一样,需要高低8位交叉
package main
import (
"fmt"
"net"
"os"
)
func main() {
address := ":20000"
addr, err := net.ResolveUDPAddr("udp", address)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
conn, err := net.ListenUDP("udp", addr)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer conn.Close()
for {
data := make([]byte, 20)
_, rAddr, err := conn.ReadFromUDP(data)
if err != nil {
fmt.Println(err)
continue
}
fmt.Println("Received:", data)
_, err = conn.WriteToUDP([]byte{0x00,0x01,0xA0,0xD4}, rAddr)
if err != nil {
fmt.Println(err)
continue
}
}
}
- ModBus P6-475
- 进入HWCONFI,PLC,数据交换COM/Ethernet,这里我是使用网络
6040H 控制字,用于电机设置,电机使用需经过初始化操作(P17),00H->06H->07H->0F。此时,电机的6041H的低4位将反馈0000-0001-0011-0111
6060H进行工作模式设置,通过6061H反馈。YSS-C电机支持:1位置模式.3速度模式.6回原点模式.0未定义
绝对位置运动指令控制字发送0x0F->0x1F,相对位置运动指令控制发送0x4F->0x5F
YKD3522M 研控三相数字步进机驱动器(脉冲+方向控制步进电机)
步进电机又叫脉冲电机
步距角:就是一个脉冲走多少个角度,例如手上这个研控的YK397A-H电机,1.2DGE。那么走一圈360度,需要300个脉冲。
细分设定:每个电机脉冲分为多少个驱动器脉冲,目的是将其细化,一个脉冲走1.2度,那就太不精细了。例如设置为4000,则360度需要4000个脉冲才会走完。通过细分设定,电机的控制分辨率就更高了。
PU 进步脉冲信号 DR 方向控制信号 MF 电机释放信号