plc快速教程



plc快速教程,组态没必要看,PLC现在一天三变的,但是了解一下吧,万一有穷逼企业用SLC这种古董。主要讲PLC编程,编程思维,毕竟这些是通用的。教程分为12个知识点,只要C语言基础好,基本一天就可以拿下,教程只给方向。


因为长时间不做plc,容易忘记,所以制作这个快速教程。参考了浙江大学AB plc可编程控制32讲,如果感觉消化困难,最好配合视频一个点一个点的过。




知识点0


梯形图看法,"------"串联是"|"与,"--__--"并联是"&"或.


-][-常开
-]/[-常闭
-()-输出
-(L)-锁存
-(U)-解锁
#起始位
脉冲就是阶梯变化。
所有的在指令方块,我教程里统一称为函数,便于让大家理解。


现在开始把PLC梯形想象为是男人上100楼那个游戏,如果没玩过就去玩一下。








知识点1.


一个机架有8个io组,每个组有32位。
模块点位有
8位bit 16位hword 32位word


机架号=机架数量/寻址方式/8
寻址方式
单架寻址,1/2寻址,双架寻址
远程机架不和本地一起。
物理地址就是


机架号,io组号/端子点位
这个和文件号组成组态用的地址,所以很重要。参考单片机输入输出。


知识点2


这里开始是程序框架,PLC相当于一个固定框架的单片机或者FPGA,照着设定好的框架,填写数据到物理地址,指针地址,内存地址.
<1>
MCP 主程序
{
IO接口扫秒与块输入更新
编写好的程序扫秒
}
1,可以有16个主程序扫描


MCP1-MCP16
2,禁止IO扫秒,直接进行程序扫秒
MCP(1|2|3.....)然后扫秒io 


在状态寄存器里禁止 地址s:79<(16-位置1) 




<2>
中断流程优先级


1停止MCP
2{
 故障
 输入PII
 定时STI
}
3然后返回MCP


知识点3


这里开始是文件系统,相当于uboot的内存地址映射表,如果玩过arm的同学这里基本上没有毛病,快速通过。
plc-5
数据文件寻址
0-8号文件系统用了
用户从9号文件开始搞
文件名称,文件号,元素号,字号,位
元素 单字 三字 多字


文件名称 一共1000,用户可以创建的也有。


开头的9个默认文件类型0-8


所有的数据都在文件中,
0o
输入
1i
输出


8进制的数字表示
o:或者i:机架号,io组号/端子点位




2s
状态




{
诊断信息
处理方式
扫秒时间
通讯设置
}




s:e元素号/b位号
运算状态
s:0/0表示进位
s:0/1溢出
s:0/2结果为0
s:0/3符号位正负
s:0/4-s保留位
处理器状态
s:1/0-4运行状态
s:1/5强制标志有效
s:1/6强制建立位
开关信息
s:2
0-5 6位表示十进制0-63转二进制数表示dh+站号
6位表示扫秒方式,设置为0表示适配方式
s:12-11
00无效
10 1/2寻址
01 1槽寻址
11 2槽寻址
s:13 1 eeprom装载
s:14 1 没有备份
s:15 1 寄存器无保护
s:3-s:6 dh+站号
六组十六位数6*16个站号
s:8最后一次扫秒时间
s:8-s:9扫秒时间
s:9最大扫秒时间 小于看门狗时间
s:12-s:14 故障状态
s:12 表示故障代码
s13 故障文件号
s:14故障阶梯号
s:18-s:23系统时间 年月日时分秒
s:27 低8位禁止位0-7机架 高位复位 
s:33  10-17
s:35 20-27
禁止状态位对应机架的IO扫秒,禁止后输出保持禁止前状态
复位 只是断开输出回到0
s:79 16位对应mcp a-p
s:80-s:127每三个字表示一个mcp{文件号,扫秒时间,程序最大扫秒时间}
例子{s:80 s81 s82 }一组,以此类推




3b



指令寄存器等 中当中间继电器来使用 1.6W点


单字元素


编程地址 
方法1
bf:e/b
位文件名 文件号 元素号 位
方法2
b:f/b
位文件名 文件号 位
1-1.6w位


4t
计时器


三字元素


字0 控制 位15使能位en 正在计时位tt 结束位dn
字1 设定值pre
字3 累加值状态acc


Tf:e.s/b
文件名 文件号 (元素字.元素字号) /位




注记符使用。
文件名 文件号 位/tt 文件名 文件号 位/en 文件名 文件号 位/dn  文件名 文件号 位.pre 文件名 文件号 位.acc






5c
计数器
三字元素
字0 控制 加法有效位cu 减法有效位cd 结束位dn 上溢出ov 下溢出un 高5位
字1 设定值pre 
字3 累加值状态acc


Cf:e.s/b


文件名 文件号 (元素字.元素字号) /位


就是自加自减类似 i++ i--




6r
控制




{移位寄存器
文件指令
顺序指令
}
三字元素
字0 状态 15en使能 13dn结束 11er错误 ul10转出 in9禁止 df8发现位(搜索和比较时候用)
字1 阵列长度len
字3 指针pos


Rf:e.s/b
文件名 文件号 (元素字.元素字号) /位






7n
整数
单字文件
NF:e/b
文件名 文件号 字或原子 /位


8f
浮点
单字文件
32位带小数点的实数
寻址到元素,位没有含义
Ff:e
文件名 文件号 元素字




知识点5
三种寻址方式也很重要,这个就和FPGA的地址操作基本一样了。


间接寻址[]
ntcrbiost
文件名文件号元素/[文件名文件号:位]
文件名[文件名文件号:位]元素/位
文件名[文件名 文件号  元素/位]


变址寻址(偏移地址)#
偏移量放在s:24
#文件名 文件号 字或元素 /位
1不超文件类型限定值
2偏移量不变
3偏移量必须提前设定


符号寻址(标签寻址)
规则
名称字母开头
最多10个字符a-z 0-9 () _ @




常数
整数16位字
浮点32位字










知识点6
用面对对象的逻辑,C语言,类与结构体可以作为参考,我也做了很多注释。相信没问题.


指令系统
1继电器指令
位状态,输入输出文件对应的IO模块的点位
输入指令


检查闭合xic 常开指令
bool型
位地址为1时闭合


检查断开XIO 常闭指令
位地址为1时打开




输出指令




激励ote
非保持型指令
使能输出1
阶梯条件为真执行
由输入指令控制


成对使用{
锁存otl
第一次为真,一直锁定等待解锁
保持型指令
锁定输出状态


解锁otu
第一次为真,一直解锁等待锁定
保持型指令
锁定输出状态
}


立即输入iin
中断程序扫秒,立即更新指定输入IO
直接输入机架号和I/O组号,不能输入文件号


立即输出iot
中断程序扫秒,立即更新指定输出映像表的字
直接输入机架号和I/O组号,不能输入文件号






计时器/计数器指令
输出指令
计时器指令:


通延时ton


预定时间内延时
阶梯条件为真,触发延时
停止条件
{
累加值=设定值
阶梯条件变假
复位指令
}
时基 timer base 1s与0.01s有的PLC可以0.001s
设定值 0-32767
累加 动态显示延时数值 复位变0
时基x设定值=延时长度




断延时tof
阶梯条件由真变假,触发延时


{
累加值=设定值
阶梯条件变真
复位指令
}


保持型rto
保持条件
{
阶梯条件变假
改变编程方式
处理器断电出错
}
停止条件
{
cpu重启
reset指令
}


计数器指令:


加技术ctu
设置值 正负32767 16位整数负数补码存放
累加值 计数到多少
由假变真计数 脉冲计数


加法有效位 使能计数器cu 15位
阶梯条件变假或者RES复位为0
加计数完成位dn 13位
超过设定值依然保持置位,复位用res


加计数器溢出位ov 12位,超过正32767启动并把计数设置位负32767重新计数,res复位。






减计数ctd
设置值 正负32767 16位整数负数补码存放
累加值 减计数到多少
由假变真计数 脉冲计数
减法有效位 使能计数器cd 14位
加计数完成位dn 13位
超过设定值依然保持置位,复位用res
下溢出位un 11位
小于预置值,un置1,继续计数,res复位


复位指令res
reset




逻辑指令


比较指令


比较cmp
阶梯为真触发
操作时间长
操作符
1
<> +-*/sqr **指数 
bcd转二进制frd
二进制转bcd tod
2地址直接地址,间接地址,变址地址


3 o八进制 h十六进制 b二进制
表达式中多80个字符


格式
{
source a
比较
source b
}


等于equ
不等于neq
大于等于geq
小于等于leq
大于grt
小于les




极限lim
测试一个数值是否在某一个范围内
if(min<INPUT< max)


{
low 最低限
test 输入值
high 最高限
}
如果min>max 这个时候输入为假,结果为真 类似带阻滤波算法


屏蔽相等meq
{
source 源
compare比较
mask屏蔽 如果位是1则比较
}
位比较
类似"|"+屏蔽指定位
if(compare|mask>source)类似这个样子






计算指令
计算cpt
输出指令
阶梯为真时触发


cpt类似算法或者主算法函数,最多80个字符
执行的是表达式
输出结果,自动转换输出类型




1拷贝 cpt
原地址数据拷贝到目的地址。


2清零clr
表达式输入0,目的地址就置0了


3算数


反余弦acs
反正弦asn
反正切atn


{
source 源 绝对值小于等于1 180度 1/2派
dest 弧度16位实数
}


正弦sin
余弦cos
正切tan
{
source 源 小于205887.4 2派(正切小于等于102943.7 派/2)
dest 弧度16位实数
}










加法add
减法sub
除法div
乘法mul


格式
{
source a
source b
dest c
}


平方根sqr开根号


{
source a
dest b
}
x的y次幂xpy
{
source a 
source b 指数
dest c 
}






自然对数ln
常用对数log
实数取反neg 正负取反~不是位取反
{
source a
dest b
}
ave求平均值
数组求平均值


文件数组
{
file #该文件或者数组第一组数地址
dest 结果
control 存放指令信息的地址 是控制字 r6:0(状态,长度,指针地址)
length 需要计算的文件长度 单位字,0-1000
position 所有地址指针量除以长度
}
排序srt
标准偏差std




4逻辑 
|与and  位都为1得1,其余为0
&或or   位有1则为1,0为0.
||非xor 位有1则为0,1为0 位取反  
&&异或not 位不同为1,其余为0 位取不同


位操作
{
source a 
source b
dest c 
}






5转换
模拟量输入模块使用AD转换,输出是DA转换
模块自动转换位了tod


bcd 4位的二进制数表示一个10位数


bcd转换整数 frd
整数转bcd   tod
{
source a 
dest b
}


弧度转度deg
度转弧度rad
标志状态 s:0/0~0/3




位处理与位传送命令
输出指令


位分配btd


16位数据bcd
{
source a  二进制,整数。源数据不变
source bit 源位,最低位
dest bit    目标地址开始最低位
dest b    溢出位丢失
length  多少位,长度
}
 从source bit位开始数length位移动到dest bit开始的位数6位覆盖,结果输出到dest b ,实际上就是个高低位移动,c实现起来爽多了,这个弄的太抽象。相当于<<和>>
字传送mov
相当于汇编的mv
{
source a 
source b
dest c 
}


屏蔽传送mvm


{
source a 
mask   b 16位二进制数1为传送,0为屏蔽
dest   c 
}
相当于desc=~(source&&mask)








知识点7
文件系统,只要有文件系统我们就能做成绩和同学!


文件指令
#文件起始地址,第一个字地址
length文件长度


文件算数和逻辑指令fal


相当于多个CPT,相当于C里的数组正则表达式
能转换位dest的数据类型


r6控制文件三个字
字0 状态 15en使能 13dn结束 11er错误 ul10转出 in9禁止 df8发现位(搜索和比较时候用)
字1 阵列长度len
字3 指针pos




{
control 存放指令信息的地址 是控制字 r6:0(状态,长度,指针地址)




length 需要计算的文件长度 单位字,0-1000
position 指针位置 所有地址指针地址的值除以长度
mode 元素方式 
1,一次扫秒全部参数读取,设置all
2,多次扫秒读参数,设置扫秒次数1-1000,小于文件长度
3,递增方式 阶梯变真启动连续读取参数在周期内,周期位文件长度,一个字为一个周期,设置为inc 所以这个相当于一个一个的读。
dest 目标地址结果
expression 设置开头字,可以有表达式,这里就是运算~和cpt一样,键入运算式.用开头字代入运算,结果输出到dest.
}
原理
expression 设置开头字,可以有表达式,这里就是运算~和cpt一样,键入运算式.用开头字代入运算,结果输出到dest.
如果不理解参考C数组操作,




文件检索和比较指令fsc


compare比较与cmp比较 是输入指令


fsc是个输出指令,阶梯条件为真触发
r6控制文件三个字
字0 状态 15en使能 13dn结束 11er错误 ul10转出 in9禁止 fd8发现位(搜索和比较时候用)
字1 阵列长度len
字3 指针pos


原理
逐字,逐位(注意是按位比较)比较后为真,发现位fd为真,储存地址.pos的值,然后进入中断开启禁止位in,执行中断服务函数.完成后复位禁止位,继续程序.


{
control 存放指令信息的地址 是控制字 r6:0(状态,长度,指针地址)




length 需要计算的文件长度 单位字,0-1000
position 指针位置 所有地址指针地址的值除以长度
mode 元素方式 
1,一次扫秒全部参数读取,设置all
2,多次扫秒读参数,设置扫秒次数1-1000,小于文件长度
3,递增方式 阶梯变真启动连续读取参数在周期内,周期位文件长度,一个字为一个周期,设置为inc 所以这个相当于一个一个的读。
dest 目标地址结果
expression  预算符号 = >< 和上面的比较函数.
}




文件拷贝cop
相当于数组拷贝
{
source a 起始地址
dest c 目标地址
lengh 字个数
}


文件写入指令fll
用一个字填充一个数组
{
source a 一个字
dest c 目标地址
lengh 字个数
}
ave求平均值在上面。




知识点8
堆栈移位指令
相当于fifo寄存器先进先出原则,用于实时数据的提前缓存.


r6控制文件三个字
字0 状态 15en使能 13dn结束 11er错误 ul10转出 in9禁止 fd8发现位(搜索和比较时候用)
字1 阵列长度len
字3 指针pos


这是我见过最TMD复杂的流水灯方法了。
bsl左移一位
b++<<xxx
{
bit shift left
file 起始位  16位字的边界起点 1.6w
contol r6
bit address 源位的第一位,最右位开始。
length 多少位的长度,1.6w位
}




bsr右移一位
xxx>>b+++
{
bit shift left
file 起始位  16位字的边界起点 1.6w
contol r6
bit address 源位的第一位,最右位开始。
length 多少位的长度,1.6w位
}




先进先出装入ffl;
先进先出释放ffu;


知识点9


程序控制指令




主控制复位mcr


mcr是成对使用,由真变假不执行,不能嵌套,不能跳转进去。
类似#if 0
有条件开始,结束必须用无条件结束。
-(mcr)-|




跳转jmp 标号lbl
标号根据机型不同 SLC256个
条件为真jmp跳到lbl
-(jmp)-|
|-]lbl[--
类似go to
不宜向后跳。容易造成延时,先前执行的程序保持状态,所以不能随便搞.




for next brk循环指令
{
lobel标号
index 变址值
initial 起始值 整数
terminal 终值 整数
step size 单次步长值 
}
for(i=0;i>10;i++)一个逻辑
index=init然后执行下一次比较init<termial 然后index+step移植到index>terminal或者brk.nxt是单步中断,然后搞服务函数,然后返回for函数。






跳转到子程序jsr
{
prog file 程序文件号
input 输入数据 变量,程序用的参数
return 返回数据
}
sbr子程序
{
input 对应主程序变量
}
返回主程序ret 可以返回变量


和arduino构架一样
loop(int *a)
{
fun(int *a)
{
a++;
return a;
}


}


输入返还变量不能超过8个
jsr参数必须多余sbr参数个数
ret返回参数必须大于等于jsr的参数个数
调用的嵌套个数不能超过8层,在plc5中。
sbr必须是第一梯第一条指令
ret结束,必须是一个无条件的ret梯子










tnd暂时结束 
输出指令


让程序从头开始执行到tnd再循环




afi恒假指令 
输入指令
单个阶梯全部为假




这两个是在线调试命令


ons一次启动


防止干扰 
osr上升沿一次启动
由假变真


osf 下降沿一次启动
由真变假
输出一个阶梯由假变真的梯变为一个位,输出到一个字的一个位,然后恢复。
{
storage 一个字的一个位 存储位
output bit 指定二进制位
dest c 输出字
}
如果阶梯动作,storage置1,dest 指定二进制位output置1然后置0,


相当于 
第一次上升沿
if(阶梯动作)
{
storage&1        
dest&(1<<output);
dest|(1<<output);
}
第二次阶梯下降沿触发 
if(阶梯动作)
{
storage&0 置0        
dest&(1<<output);
dest|(1<<output);
}








sfr顺序功能图复位
eot转换文件结束指令
一对指令
输出指令
{
prog file 起始地址
reststart step at调转到指定步
}
上升沿触发 只执行一次,下一次恢复,程序尾eot结束。




uie uid禁止用户中断


uid开始
中断用户的中断函数{
定时中断sti 过程中断pii
}
uie释放






知识点11
过程控制指令pid
上升沿触发
{
control block 整数文件 专门文件pd 80个字 状态字15位pd.en表示使能


process variable 过程变量,输入变量。
tieback手动返回


output 输出值
}


rsturn软件设定pid系数,然后再修正。


算法具体参考我写的自制平衡车或者4轴教程。






块传送模块btr btw
与单片机里的dma一样 最多64个字
btr 读  btw写
{
block trnsfr read write
rack 机架号
group io组
module 模块 寻址方式 1槽以上1 以下0
control 控制文件 这里不需要使用#其实地址 5个字 0号字状态字,1号字数据文件的长度.rlen 2号字.dlen实际长度,3号字数据的文件号,4号字文件起始地址。
date file  储存文件
length 长度1-64
continuous连续  ”yes or no“yes一次触发直到传输完,状态字11位.co复位为0停止  no,靠阶梯动作控制.
}


信息指令msg
1000字文件操作指令


dh+ 120字的封包
eth 709的封包 以太网用两个mg控制文件 2个56字


mg文件类型 56个字的控制块
{
send / receive 
contorl 
}

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值