电脑知识
少儿变量模块编程
2023-04-12 00:23

[石化]看个重播被吓到了,从开始到结束,这个人表情从未变过,有不信的小伙伴可以去看看重播,这是给他编程的时候,忘记加变量了吗?[捂脸]

《每天学一点PLC编程》之10-1 数据类型 VARIANT

VARIANT 类型的参数是一个指针,可以指向不同数据类型的变量。与 ANY 指针相比,VARIANT 是一个带有类型检测的指针。这意味着目标结构和源结构在运行时被检查,必须是相同的。

例如,VARIANT 用于通信块(TSEND_C)作为输入。

优点

• 集成的类型测试可防止错误访问。

• 通过 VARIANT 变量符号寻址,代码更易阅读。

• 代码效率更高,处理时间更短。

• VARIANT 指针显然比 ANY 指针更直观。

• 在系统功能的帮助下,可以直接使用正确类型的 VARIANT 变量。

• 可以灵活高效地传输不同结构的变量。

ST结构化编程思路

PLC编程的结构化思路很重要,以前写PLC程序用的梯形图方式,结构不清晰,比如写个伺服电机程序,都是用区域划分变量,电机的区域,里面用到的传感器信号,电机参数,模式按钮都定义在一起,程序也是这么划分的,分为电机程序,相关的逻辑都写在电机区域处,也没啥不好,以前用感觉挺好用的,大小项目都能做。

后来用ST编程,思路就不一样了,ST思路属于面向对象的,写程序不会划分区域,也不会把变量都定义到一起,比如相同的方法写个伺服电机的程序,ST会先定义结构,按照功能性定义,基本上定义完成,程序结构和逻辑也就出来了。不会再根据程序去定义变量。

第一步:

电机我会建立一个文件夹ServoMotor,里面定义数据结构,图一:

e_MotorMode;

str_MotorIn;

str_MotorPar;

str_Motor

枚举e_MotorMode做控制电机模式选择

结构str_MotorIn用来定义输入信号

结构str_MotorPar用来调用电机参数

结构str_Motor 电机内部定义参数,一次写死不需要更改

第二步:

定义结构变量内容:

e_MotorMode:

TYPE e_MotorMode :

MOTOR_MODE_NONE := 0,

无模式状态

MOTOR_MODE_HOME := 1,

Home模式状态

MOTOR_MODE_RESET_CALIBRATION, 重新校准零点状态

MOTOR_MODE_MOVE_ABSOLUTE, 移动模式

MOTOR_MODE_JOG

手动模式

END_TYPE

str_MotorIn:

TYPE str_MotorIn :

STRUCT

bLimitPos : BOOL; 正向限位传感器

bLimitNeg : BOOL; 负向限位传感器

bHomeSensor : BOOL; 原点传感器

bHandPos : BOOL; 手动正向信号

bHandNeg : BOOL; 手动负向信号

strInfoMation : str_InfoData;

电机内部错信息

END_STRUCT

END_TYPE

str_MotorPar:

TYPE str_MotorPar :

STRUCT

sType : STRING(3);

选择轴的运行方式,直线还是旋转

rHomingVelocity : LREAL;

回原点速度

bJoystickHardware : BOOL;

手动模式选择

strAxisParameter : str_NcAxis;

电机的自带参数,一次写死不需更改

END_STRUCT

END_TYPE

str_Motor:

TYPE str_Motor :

STRUCT

eHomeMeth : e_HomingMethod;

回原点方式

bDirDrive : BOOL;

电机正转

bDirEncoder : BOOL;

电机编码器正方向

bSoftLimitEnable : BOOL;

软极限设置

rSoftLimitPositive : LREAL;

软极限正方向

rSoftLimitNegative : LREAL;

软极限负方向

rMaxVelocity : LREAL;

最大速度

rMaxAcce : LREAL;

最大加速度

rMaxDecel : LREAL;

最大减速度

rHomePos : LREAL;

原点设定

bHomeDir : BOOL;

寻找原点传感器方向设定

END_STRUCT

END_TYPE

第三步:

开始程序调用

除了上面这些结构,需要调用库文件里的运动模块,如图3,写不同的动作,调用不同的变量和模块。正常程序逻辑就是调用赋值就能完成。

例如想移动则调用图2里的strMotorRef,赋值就可以,其它功能鞋相应的程序,程序跟着需求走。

#Rust语言中不可变性、可变性

Rust设计初衷是为了内存安全,特别是多线程并发环境下的安全。它要求所有声明的变量默认具有不可变性,比如:let a = 32; 描述变量a表示的值一旦初始化后,是不可变的,不能再修改它。

但它可以不可变的方式传递给不同的函数、通过Channel发送出去在其他线程中处理,在其传递使用过程中,有可能多个实体期望访问它,则使用&的方式来引用它,由于被引用的变量a本身不变性,那么其&a引用变量也不能修改它。

不可变性变量的传递,代表初始构建者的一种责任,一旦传递出去就不会再修改它,由接收者来从中读取或Copy出其内容再处理,跟手机发送消息的过程类似。

其好处,在于遇到这样的变量及其引用&,使用者都可知道它是不可变的,编译器可进行针对性的alias优化。

如果某个变量b后续可能要修改,则须加上mut声明来标记。比如:let mut b = 100,这时也可通过&mut借用的方式来修改该变量表示的内容,这样的变量如果通过参数传递给其他线程<另一个实体>来使用,则会遇到多个实体对共享内容进行读、写的同步问题。

Rust语言为了实现对共享内容的修改,针对不同使用场景,设计了所有权及引用借用规则及内部可变性。

非凸科技是Rust量化先行者,追求高效和极致。欢迎擅长Rust,热爱量化的小伙伴们,加入非凸~

#可变性 #不可变性 #编程 #内存安全 #场景

plc使用ST语言,如何实现复位和置位指令?

复位和置位指令,是梯形图编程中经常使用的两个指令,使用这两个指令,不用担心双线圈输出问题,因此,非常方便。那么,在ST语言以及博途SCL语言中该如何实现呢?

其实,直接使用赋值语句就可以,置位和复位指令的实质,就是让某个变量变为1或者0,而赋值语句,也是让某个变量的值改变。

西门子博途中,实现复位和置位指令如图中所示,在CODESYS中,有专门的运算符 S= R=来实现,不过很少使用。

所以,PLC中,赋值语句使用非常广泛,它相当于梯形图中的MOVE指令,还可以实现RST指令和SET指令的功能。

PLC结构化文本编程 图书

发表评论
0评