lihui163 发表于 2021-12-18 16:32:54

【开源】基于STM32的迪文PLC的底层代码

本帖最后由 lihui163 于 2021-12-18 19:53 编辑

   对于工业控制来说,PLC应用最多了以前是基于完全有stm32单片机来控制的迪文PLC,这种PLC有个缺点,每次都需要烧录程序来改变设备的功能,对于从事工控行业的PLC工程师来说,很少会用单片机的,绝大多数都是通过梯形图来控制PLC的,那么如何解决这个问题呢
设计一种stm32的底层驱动程序,也可以说是内核固件吧,这样就可以通过梯形图来实现对stm32控制了

一、基本原理如下
单片机上跑了一个PLC的底层系统,并且实时监视串口数据。PC机上通过梯形图编写PLC指令代码,通过串口传至单片机,单片机对串口数据解析并且保存,然后不停的执行保存起来的指令。
二、PLC编程指令


1、编程的指令量取决于PLC内部的程序空间容量,比如三菱早期的FX1S之类的PLC,只能容纳2千条指令程序,而1N之后的型号,是8千条,2N和现在的3U则更多了。
LD X1这就是一条指令,其意思是将输入点X1的状态装入堆栈,
OR X2这是第二条指令,其意思是将输入点X2的状态装入堆栈,和X1的状态做“或”的运算。
OUT Y0是第三条指令,其意思是将前面X1和X2的状态或运算后写到Y0这个输出点上。
因此,这三条指令实现的功能是:X1或X2这两输入点,只要任意一点输入接通,Y0就有输出。
单片机的IO口是双向的,只要在头文件里或者你的程序里设置了输入或者输出,就可以用了,比如P0.0你可以用来当输入点,也可以用来当输出点,
但是PLC的输入点和输出点是厂家规定好了的,用户不能更改。比如三菱的输入点用X表示,输出点用Y表示,西门子的输入点用I表示,输出点用Q表示

西门子的S7-200系统PLC,容量不是用条来计算的,是用KB,一个S7-200 CPU224的PLC,最多可以存放16KB的程序。

2、一条指令占flash多少个字节呢?
这个,PLC的系统手册上并没有明确说明,三菱的FX1N,是8千条指令对应空间8K,不知道是否可以理解为一条指令占用一个字节的空间?
西门子的PLC指令,是编程软件自动转化为厂家自定义的编码后下载的,只要转化后的程序不多于16K就可以。

3.对memory的操作,也是属于编程吗?
对寄存器的操作,也属于编程,
但是,PLC的寄存器跟单片机的寄存器有大大的区别:
PLC的寄存器分两大类,
(1)是特殊寄存器
用户只能读取,不能改写,比如三菱的M8002寄存器,其作用是PLC开始运行的首次扫描周期为ON,之后一直为OFF,M8013,PLC运行后0.5秒为ON,0.5秒为OFF,以此循环动作,用单片机的说法就是以1S的时间为周期振荡。
特殊寄存器的编号,FX-1S是M8000~M8255,一共有256点,而现在的FX-3U是从M8000~M8511一共有512点,这些是只读,不可写。每个寄存器都有厂家规定的特殊功能,详见PLC编程手册。
(2)数据寄存器
用户对其可读可写,
三菱FX-1S   D0~D127               有128个16位寄存器,无掉电保持功能,
            D128~D255         有128个16位寄存器,有掉电保持功能,
            D1000~D2499      1500个,文件专用,文件用参数设定,可以设定为文件寄存器。
            D8000~D8255         256个,特殊用,只读

西门子S7-200系列:(支持位、字节、字、双字等4种方式读写),掉电保存功能用编程软件设置。
       MB0~MB31    32字节,可用于位状态,也可用于数据存储。
       VB0~VB8192    8K字节,支持位、字节、字、双字等4种方式读写
三、底层代码分析
以三菱的FX2N为例
1、基本指令   

OUT 、SET、 RST、LPS、LPF

2、 程序流程指令:

CJ、CJP、CALL、CALLP、SRET

3、 传送比较指令

   CMP、CMPP、DCMP、DCMPP、

   ZCP、DZCPP、 MOV、DMOV、

   SMOV、CML、DCML、BMOV、

    FMOV、DFMOV、XCH、DXCH、

    BCD、DBCD、BIN、DBIN

4、算术与逻辑运算指令

ADD、DADD、SUB、DSUB、

MUL、DMUL、DIV、DDIV、

INC、INCP、DINC、DINCP

DEC、DECP、DDEC、WAND、

DWAND、WOR、DWOR、WXOR、

DWXOR、NEG、DNEG

5、循环与移位指令

ROR、DROR、ROL、DROL、

RCR、DRCR

RCL、DRCL、DEMOV

6、数据处理指令

ZRST、DECO、MEAN、SQR、DSQR、

FLT、DFLT、REFF、MTR、

7、浮点运算指令

DEADD、DESUB、DEDIV、DEMUL、

DESQR、DEMOV

INT、DINT、DSIN、DCOS、DTAN

8、高低字节交换指令

SWAP、DSWAP

9、时钟运算指令

   TCMP、TZCP、TADD、TSUB、

   TRD、TWR、GRY、GBIN、DGBIN

10、触点比较指令

LD、LDI、AND、ANI、OR、ORI

LDP、LDF、ANDP、ANDF、ORP、ORF

LD=、DLD=、LD>、DLD>、LD<、DLD<

LD<>、DLD<>、LD<=、DLD<=、LD>=、DLD>=

AND=、DAND=、AND>、DAND>、AND<、DAND<

AND<>、DAND<>、DAND>=、DAND>=、DAND<、DAND<=

OR=、DOR =、OR >、DOR >、OR <、DOR <

OR <>、DOR <>、DOR >=、DOR >=、DOR <、DOR <=

11、其他指令

ECMP、EZCP、PID、ALT、HSCS、PLSY、END、RET

12.通讯协议
二、PLC工作原理
1、PLC的工作方式,首先读取输入点的状态,然后执行梯形图程序,接着处理通讯请求,然后执行硬件诊断,最后写输出,这样为一个周期以此类推循环运行。
2、空间缓冲区域,就是存放定时器当前值,计数器当前值输入输出状态值等数据的空间。还有通讯发送缓存和接收的缓存。
3、用户程序的起始空间位置
你如plc用户FLASH 起始地址 0x0800C000;空间大小 8K,这个就是存放用户的梯形图的空间。
4、通讯口
一个是与其他外围设备通讯的接口(部分PLC有两个以上的通讯口),三菱的是422,西门子的是485芯片:电脑上的梯形图编程软件与硬件的通讯,上下载程序,监控等
与变频器、伺服电机、步进控制器、触摸屏等设备的通讯口通讯,另一个,是这个STM32芯片与PLC扩展模块的通讯,是用来扩展输入输出点的,有数字量输入输出扩展、模拟量输入输出扩展等扩展模块。
(这个的通讯方式可以是I2C,CAN,SPI等方式)
5、一堆D,是PLC的内部寄存器,用户可以用这些寄存器来存放数据。










xiaofangzi 发表于 2022-8-7 19:11:03

厉害,有开源方案嘛?

lihui163 发表于 2022-8-24 20:26:18

xiaofangzi 发表于 2022-8-7 19:11
厉害,有开源方案嘛?

暂时没有开源
页: [1]
查看完整版本: 【开源】基于STM32的迪文PLC的底层代码