(原) Delta台达学习记录

原创文章,请后转载,并注明出处。

最近在使用台达的PLC,稍作记录

台达官网:delta-china.com.cn

威纶通:weinview.cn


部份链接:

台达AS系列PLC通讯台达A2-M伺服

台达AS系列PLC通讯台达A2-M伺服

台达伺服CANopen 功能介绍

台达DVP-PLC CANopen连线程序设计范例

基于VB实现台达PLC与PC_机串行通讯

基于Modbus_TCP协议台达PLC与上位机VB软件之间的通信

台达CANopen模式下的速度模式调节方法


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的执行方式:读取外部输入信号状态–执行程序,修改输出状态–执行输出状态。

所以:

  1. 在程序执行期间不会再次获取输入状态。
  2. 程序执行完后,统一修改输出状态。则在程序中各个输出状态,以最后状态为准,过程状态并不体现。

位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

我的话

  1. CANopen用于与支持此协议的步进电机通信,对电机进行控制,有线,载于RS485之上

  2. ModBus用于与HMI触摸屏通信,载于EtherNet之上,实现无线控制

  3. 配置研控步进电机步骤:

    1. 启动COMMGR,添加倍达PLC,默认192.168.1.5
    2. 新建工程,通讯设置,连接COMMGR上的PLC
    3. HWCONFIG进行设备配置:设置PLC->内建CAN通讯口->工作模式:CANopen DS301协议->通讯速率根据实际
    4. PLC点选右键->通讯软件->CANopen Builder
    5. 进入CANopen Builder软件中,工具->EDS操作,导入研控电机对应EDS文件(YSS60C是集成式电机,EDS文件官网下载)
    6. 选中PLC->点击在线->点击下载(到PLC)->断电重新连接(点击在线)->点击扫描,发现在线电机
    7. 双击电机,进行协议配置->下方"已配置的PDO"->双击查看Rx和Tx两类已配置的协议,根据需要添加删除
    8. 在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位,在取数据时比较麻烦,可以单独配置到一组协议或配置于某组协议的尾部

    1. 配置完成后,双击PLC,进入“节点列表配置” -> 将可用节点添加到节点列表,下方将出现对应的寄存器(用于指令操作)
    2. 若发现8位指令与16位交叉出现,需重新配置,避免取数据麻烦
    3. 关闭CANopen Builder,返回HWCONFIG,点击下载,将配置送到PLC
    4. 补充:CANopen在电机上使用了一组接口,CANL.CANH.GND,另一组CANL/CANH使用了61欧电阻短接(此电阻在电机中已附带,不需要另接物理电阻)。
  4. 通过CANopen控制步进电机中的Y输出端口

    1. 在CANopenBuilder中添加控制协议2030-C,即输出端口的批量控制。以及2004-0,即获取一组输出端口状态。然后获取对应的寄存器号。
    2. 将变量的0.1.2三位设置状态,即对应Y0.Y1.Y2控制
    3. 研控YSS60C电机支持PNP及NPN方式,我们测试的是将YCOM接负极,当Y=ON时,输出负电平信号。(可以这样认为:Y端口的ON/OFF只是形成导通,公共端口接地,测量时,需一端接正电,当Y=ON时,形成正负导通)
    4. Y端口不需要初始化设置(应该为默认值0)
    5. 端口需要手动OFF
  5. 今天测试TCP/UDP网络通信,以及ModBus与PC通信(10.25)

    1. 测试环境:PLC为从,PC为主,接收D2000,发送D1000。 PLC发送的信息,PC接收后高低互换位。(通过SWAP指令可以置反高低8位)
    2. 在Go中建立简单TCP Server,通过conn.Write([]byte(“Test”))可以发送字符串或者发送数据conn.Write([]byte{0x50,0x32,0x51,0xD0,0x38,0x10}) 均需高低8位置反
    3. 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
		}
 
	}
}
  1. ModBus P6-475
    1. 进入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 电机释放信号