[石化]看个重播被吓到了,从开始到结束,这个人表情从未变过,有不信的小伙伴可以去看看重播,这是给他编程的时候,忘记加变量了吗?[捂脸]
《每天学一点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结构化文本编程 图书