ST结构化文本语言与示例(持续更新20221117)

基本数据类型

类型名称 类型标识符 数据下限 数据上限 存储空间
布尔型 BOOL 0 1 1bit
整型 字节型 BYTE 0 255 1byte
字型 WORD 0 65535 2byte
双字型 DWORD 0 4294967295 4byte
短整型 SINT -128 127 1byte
无符号短整型 USINT 0 255 1byte
整型 INT -32768 32767 2byte
无符号整型 UINT 0 65535 2byte
长整型 DINT -2147483648 2147483647 4byte
无符号长整型 UDINT 0 4294967295 4byte
实数型 REAL -3.402823E+38 3.402823E+38 4byte
字符串行 STRING 默认 80 个字符,最大255个字符,第一个字节存储字符串长度。 256byte
时间型 时间型 TIME TIME 表示一个时间值, 单位为毫秒, 初始值为 0。 4byte
时刻型 TOD TOD 表示当天的时刻, 单位为毫
秒, 初始值为凌晨 0 点 0 分。
4byte
日期型 DATE DATE 表示当前日期, 单位为秒,初始值是 1970 年 1 月 1 日。 4byte
日期时刻型 DT DT 表示当前日期和时刻, 单位为秒, 初始值是 1970 年 1 月 1 日凌晨 0 点 0 分。 4byte

自定义数据类型

数组定义:
<数组名>:ARRAY [<L1>..<M1>,<L2>..<M2>,<L3>..<M3>] OF <基本数据类型>一维数组
A1: ARRAY[0..9] OF BOOL;
二维数组
A2: ARRAY[0..9, 0..9] OF REAL;
三维数组
A3: ARRAY[0..9, 0..9, 0..9] OF INT;

枚举:
TYPE<标识符>:(<Enum_1>,<Enum_2>,…,<Enum_3>);
END_TYPE
定义举例
TYPE Color :
(
Red := 0,
Green,
Yellow
);
END_TYPE

结构:
TYPE <结构名>:
STRUCT
<变量声明 1>
<变量声明 2>
… <变
量声明 n>
END_STRUCT
END_TYPE
定义举例
TYPE Motor :
STRUCT
V:REAL;
A:REAL;
Hz:REAL;
END_STRUCT
END_TYPE

指针:
<指针名>: POINTER TO <数据类型或功能块类型>
定义举例
Pt:POINTER TO INT;
Int1:INT;
Int2:INT;
Pt:=ADR(Int1);(*取地址*)
Int2:=Pt^;(*取值*)

CAPTRON电容式触摸开关简单测试

收到CAPTRON提供的电容式触摸开关的试用样品。

电源是24VDC,输出是PNP形式,脉冲时间大约持续1秒钟左右,触控后指示灯变红,自带一个绿色指示灯。

包装在工控行业算是比较精美了。

当然价格也很美丽。

外观是下面的这个样子。

接上线是下面的这个样子。

接上电源后。

触控后显示的是红灯。

 

 

 

PLC程序之线圈指令

我们学习PLC程序设计的时候第一个程序可能就是启保停程序,这个程序的线圈输出是PLC指令中一个比较特殊的指令。

上述的这个程序可以转换为Y0=(X0 or Y0) and (not X1),这段程序只要执行了,就要把结果输出给Y0,我们常常认为上述的程序段要比下面的程序段安全,在断电后不会出现设备自启动情况。

如果Y0定义成了掉电保存,那么上述的第一段程序会在上电后一直执行,结果是Y0没有输出,而第二段代码则不会执行,Y0会保持掉电前的状态,所以会认为第一段代码更安全一些。

第一段代码如果用语句表来表达,会更容易理解,因为解释这段代码要牵扯到堆栈操作,这里就先不做解释了。

因为线圈指令的特殊性,所以很多教材都强调避免双线圈输出,就像下面这段代码,线圈的输出结果是最后一条指令执行的结果。

上述Y0的输出是取决于X1的断开或闭合,X0是不起作用的。部分编译器会提示警告,而不是错误。

上述双线圈程序是否可以改一下,也是可以使用的,比如下面这种方式,采用两个子程序调用,而两个子程序的调用时互斥的。

主程序

子程序1

子程序2

双线圈输出使用尽量小心,但是还是比较容易出错,还是尽量避免使用比较合适。

想起一个例子:这里用线圈指令的特点和中断程序实现X0单键控制Y0的启停,具体做法:按下X0,上升沿触发中断程序,使Y0闭合;再次按下X0,上升沿触发中断程序,使Y0断开;周而复始执行上述过程。

主程序里关联硬件和中断程序。

中断程序如下

每次按下X0的按钮时,执行一次中断程序,相当于Y0的输出取反。

徐大军

2022年9月3日星期六

控制器介绍

大约2019年的时候给同事讲解PLC的知识,保留了部分。

1、控制器简介

1.1、专用控制器

面向有限的几种控制方式,组态式编程。

西门子RUL220


1.2、DDC控制器

用途基本上局限在楼宇,电厂等几个行业。

霍尼韦尔的DDC控制器


西门DDC子POL638


1.3、嵌入式控制器

优点:大批量使用成本低廉,体积可以做的比较小。

单片机电路板


树莓派


1.4、PLC

专为控制领域设计的控制系统,可靠性高稳定性都比较高,防护能力强,无故障运行时间可达百万小时以上。可选择范围很广,宽温范围的可在-40-80℃运行,防护等级可做到IP65,双机冗余系统,安全PLC系统等。

专用PLC控制器,主要提供行业内功能指令


可编程继电器(德国金钟穆勒)


微型PLC


小型PLC



中型PLC


大型PLC(罗克韦尔的controllogix)


基于PC的软PLC



西门子TDC

扫描周期100us,一个机架可以配置20个CPU,最多可以44个机架同步工作。


1.5、边缘控制器(PLC)

Windos等操作系统+codesys(被称为工业领域的安卓)

Windos,linux等操作系统+LOGICLAB


1.6、触控一体机

本质上就是触摸屏和PLC集成到了一起。

集成一体,不可扩展


模块本体可扩展,也可远程IO模式


1、亿维一体机



 

2、虹科一体机



3、顾美一体机


个人感觉的西门子PLC的特点

个人喜好,个人见识有限,难免存在偏颇。
先说缺点:
1、编程软件庞大,我用博图V15的时候,它的安装包大约是16G左右,很考验电脑的性能;
2、如果没使用欧系的PLC,上手比较困难,很多概念不容易理解;
3、不支持枚举数据类型;
再说优点:
1、PLC,运动控制,HMI,SCADA等在一个软件内,写程序方便,支持拖拽,例如可以从PLC变量表中直接拖动变量到HMI中,自动生成关联,变量更新所有的地方都会更新,很方便;
2、软件支持PLC和HMI仿真,它们之间的通讯也能仿真;
3、通讯支持的协议比较多,扩展模块很方便;
4、模拟量模块可以设置电压或者电流的类型;
5、各种模块扩展方便,包括远程IO模块;
6、支持标签访问的模式,存储区的变动不影响通讯;
7、功能块类似于面向对象编程中的类,便于设备模块化;
9、支持结构化文本语言,使用比较顺手,尤其是复杂的控制逻辑或者计算;
10、支持数组和结构体类型,方便数据的管理;
11、调试方便,有调试面板和变量曲线显示的功能;
12、用的人多,资料也多,写程序容易找到例程;

程序集IL指令的反汇编工具ildasm.exe

这个工具的用途是查看生产的exe程序集中包含的IL指令代码。

工具的放置位置一般在:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\

打开工具,界面如下:

我们写一段基本的代码。

using System;

namespace ConsoleApplication2

{


class
Program

{


static
void Main(string[] args)

{


Console.WriteLine(“Hello World!”);

}

}

}

我们用ildasm.exe程序打开生成的程序集,并双击”Main:void(string[])”。

2022年4月4日

23时57分

S71200 高速计数器中断编程

实现功能:高速计数器每计数100次,计数器清零并使Q0.7输出取反。

这里使用PWM产生周期10毫秒的脉冲,做如下设置。

启用脉冲发生器(没有视图的参数采用默认值)

设置脉冲参数

设置脉冲输出点位

设置高速计数器(没有视图的参数采用默认值)

启用高速计数器

设置计数器的参数

设置初始参考值100

设置事件中断

设置硬件输出

中断程序编写如下

主程序编写

接线Q0.7到Q0.2,别漏掉电源部分。

执行结果,Q0.7以2秒周期闪烁。

VB入门程序

这一节演示输出”Hello world!”,这属于一个比较俗的开始了,我们也不能免俗了。

打开VB编程软件,新建标准EXE程序。

添加Label1标签控件,再添加Command1按钮,画面如下。

双击Command1按钮,添加代码。

Private Sub Command1_Click()

Label1.Caption = “Hello World!”

End Sub

点击工具栏中的运行按钮,程序就可以运行了。

单Command1按钮,查看运行效果。

这个例子是时间显示程序。

新建标准EXE程序,在界面添加Label控件,Timer控件。

双击Timer1控件,修改Timer1属性,并添加代码。属性Interval改为1000,代表1000毫秒,即1秒。代码中的Now是函数,它的功能是获取当前计算机的时间。

Private Sub Timer1_Timer()

Label1.Caption = Now

End Sub

运行效果如下。

2021年11月20日

下午10时17分

Visual Basic 6.0简介

Visual Basic 6.0是一种可视化的编程语言,简称VB,这个版本发布于1998年,从现在的角度看来,它确实太老了。2000年的时候它的升级本是基于.NET平台的程序,两个版本差异很大。到目前为止我依然认为Visual Basic 6.0是最容易上手的桌面编程语言,它的子集VBA依然存活在office,AutoCAD,iFIX,Solidworks等等软件的二次开发功能中,所以入门Visual Basic 6.0还是有用武之地的。

2021年11月20日

下午10时2分

IP防护等级说明

IP防护等级表示方法
防护等级多以IP后跟随两个数字来表述,数字用来明确防护的等级。

第一位数字表明设备抗微尘的范围,或者是人们在密封环境中免受危害的程度。代表防止固体异物进入的等级,最高级别是6;

第二位数字表明设备防水的程度。代表防止进水的等级,最高级别是8。

IP后第一位数字:防尘等级

数字

防护范围

说明

0

无防护

对外界的人或物无特殊的防护。

1

防止直径大于50mm的固体外物侵入

防止人体(如手掌)因意外而接触到电器内部的零件,防止较大尺寸(直径大于50mm)的外物侵入。

2

防止直径大于12.5mm的固体外物侵入

防止人的手指接触到电器内部的零件,防止中等尺寸(直径大于12.5mm)的外物侵入。

3

防止直径大于2.5mm的固体外物侵入

防止直径或厚度大于2.5mm的工具、电线及类似的小型外物侵入而接触到电器内部的零件。

4

防止直径大于1.0mm的固体外物侵入

防止直径或厚度大于1.0mm的工具、电线及类似的小型外物侵入而接触到电器内部的零件。

5

防止外物及灰尘

完全防止外物侵入,虽不能完全防止灰尘侵入,但灰尘的侵入量不会影响电器的正常运作。

6

防止外物及灰尘

完全防止外物及灰尘侵入。

IP后第二位数字:防水等级

数字

防护范围

说明

0

无防护

对水或湿气无特殊的防护。

1

防止水滴浸入

垂直落下的水滴(如凝结水)不会对电器造成损坏

2

倾斜15度时,仍可防止水滴浸入

当电器由垂直倾斜至15度时,滴水不会对电器造成损坏。

3

防止喷洒的水浸入

防雨或防止与垂直的夹角小于60度的方向所喷洒的水侵入电器而造成损坏。

4

防止飞溅的水浸入

防止各个方向飞溅而来的水侵入电器而造成损坏

5

防止喷射的水浸入

防止来自各个方向由喷嘴射出的水侵入电器而造成损坏。

6

防止大浪浸入

装设于甲板上的电器,可防止因大浪的侵袭而造成的损坏。

7

防止浸水时水的浸入

电器浸在水中一定时间或水压在一定的标准以下,可确保不因浸水而造成损坏。

8

防止沉没时水的浸入

电器无限期沉没在指定的水压下,可确保不因浸水而造成损坏。