原创 相信未来 机器人及PLC自动化应用2023-03-05 21:38发表于北京
SWRITE
SWRITE具有与CWRITE类似的功能和语法。但是,与CWRITE不同的是,SWRITE不会将数据写入通道,而是写入CHAR数组。
SWRITE可以与CWRITE结合在程序中。好处:
lCWRITE可以限制为将数据写入通道。SWRITE可以执行更复杂的格式化任务。这使得程序更加灵活。
lCWRITE***多可以处理10个变量。结合多个SWRITE语句,可以写入10多个变量的数据。
SWRITE触发提前运行停止。
SWRITE (String, State,OFFSET , Format, Var1 <, var10="">)
String: Type: CHAR[]
Var变量的格式化内容被写入字符串。
State:Type: STATE_T
自动返回到WRITE的状态
OFFSET : Type: INT
SWRITE在字符串中开始写入的位置。如果要从头开始写入,则偏移量必须设置为0。
例如:
OFFSET=0 : SWRITE从***个位置开始写入。
OFFSET=2 : SWRITE从第三个位置开始写入。位置1和2被忽略。
偏移量在写入期间递增。如果在另一个SWRITE语句的情况下,要从***个位置重新开始写入,则必须在此语句之前将偏移量设置为0。否则,将接受前一条语句的增量偏移量。
Format: Type: CHAR[]
在将Var变量写入字符串之前转换它们。必须为每个Var变量指定格式.
Var:
其数据写入字符串的变量。每个语句***多可以有10个变量。
例如:
体现出报警信息:
OFFSET=0
SWRITE(user_msg.msg_TXT[],ST_AUSG,OFFSET,"Totzeit Achse%d nach Testlauf= %d *12ms ",(EaxNum+6), TotzeitNeu)
Format:CWRITE/SWRITE的“格式”变量
CWRITE或SWRITE的格式规范具有以下结构:“ %U”
格式化字符。可选的。
多个格式字符可以应用于一个格式。
格式化字符
描述
+
转换后的值总是以符号开头:正值带+,负值带-。
如果不使用此格式化字符,则正值不带符号表示,负值用-表示。
-
转换后的值左对齐。
#
在格式x中,每个不等于0的值都以0开头。
在格式e、f和g中,总是插入小数点。
0
转换后的值前面加上零以构成***小宽度W。
[Space]
在格式d、e、f、g或i中,转换后的参数前面有一个空格。
*
格式c和r并不总是正确解释数据字符串中的空格。为避免误解,可以对空格使用带星号(*)的特殊格式规范。
因此,以该字符开头的格式不再对应于Var变量之一,而是对应于数据字符串中的空格。
要输出的***小位置数。可选的。
小数点被视为有助于弥补***小数字,前置符号则不然。为了达到***小数量,在末尾添加零字节(以小端格式)。必要时可以超过***小数量。
例子:
?VAR=1.56
"%+8.4d", VAR
结果: _ _ + 1 . 5 6 0 0
VAR=125.568
"%+8.4d", VAR
结果: + 1 2 5 . 5 6 8 0
如果宽度指定为0x,这意味着要输出的位置用零填充。
例子:
?VAR=1
"%+04d", VAR
Result: + 0 0 0 1
与不带0的规格相比:
?"%+4d", VAR
Result: _ _ _ + 1
如果未指定宽度,则使用以下默认宽度:
INT, REAL, ENUM: 4 bytes
BOOL, CHAR: 1 byte
精度规格
r在数组的情况下:要表示的数组元素数.
e, f:要表示的数组元素数.
G:有效数字位数
S:表示的***大字符数
所有其他格式:要表示的字符数。如果源值包含更多字符,则会被截断或四舍五入。
对于大多数数据类型,有几种允许的格式,例如"%s"和"%1.r"用于CHAR数组。需要选择哪种格式取决于伙伴控制器发送或接收数据的方式。
在数组的情况下,规范“Z”可用于定义要考虑的数组元素的数量。如果没有为“Z”指定值,则考虑所有数组元素。然而,该过程在***个未初始化的值处中止。一个例外是格式r。在这种情况下,该过程不会中止。相反,为尚未初始化的变量或数组元素输出随机值。
数据类型BOOL
每个不等于零的值都转换为TRUE
数据类型枚举
系统检查该值是否为允许的ENUM值。如果不是,则中止读取。***个ENUM常量的值为1。
数组的格式规范
如果没有足够的可用数据来满足格式规范(例如“%2.5r”,但仅存在7个字节),则不会读取此格式的任何内容并中止CREAD语句。被忽略的数据仍然可供读取。
格式%r
只读取变量所能容纳的字节数。其余的仍然可以阅读。如果数组足够大但字节数不是数组元素大小的倍数,则冗余字节仍可用于读取(对于以下格式或下一个CREAD语句)。
转换示例:
例子1
整数变量VI的值以十进制和十六进制ASCII表示法传输。***个CWRITE语句传输字符123。第二个CWRITE语句传输字符7B。
INT VI
VI=123
CWRITE(HANDLE,SW_T,MW_T,"%d",VI)
CWRITE(HANDLE,SW_T,MW_T,"%x",VI)
例子2
整数变量VI的值以二进制表示法传输:
INT VI
VI=123
CWRITE(HANDLE,SW_T,MW_T,"%r",VI)
例子3
传输数组的所有数组元素:
REAL VR[10]
CWRITE(HANDLE,SW_T,MW_T,"%r",VR[])
使用“%r”格式时,系统不会检查变量或数组元素是否已初始化。为尚未初始化的数组元素传输随机值。
例子4
数组的前五个数组元素以二进制表示法传输:
REAL VR[10]
CWRITE(HANDLE,SW_T,MW_T,"%.5r",VR[])
20个字节以二进制表示法传输。
例子5
传输直到***个未初始化元素的所有数组元素:
CHAR VS[100]
CWRITE(HANDLE,SW_T,MW_T,"%s",VS[])
例子6
传输前50个数组元素:
CHAR VS[100]
CWRITE(HANDLE,SW_T,MW_T,"%s",VS[])
例子7
ENUM常量的内部值以ASCII符号传输。对应号码转:
DECL ENUM_TYP E
CWRITE(HANDLE,SW_T,MW_T,"%d",E)
例子8
两个REAL值与附加文本一起传输:
REAL V1,V2
V1=3.97
V2=-27.3
CWRITE(...,...,...,"value1=%+#07.3f value2=+#06.2f",V1,V2)
传输以下数据:
value1=+03.970
value2=-27.30
在大众版本内的设置事例
SWRITE(USER_MSG.MSG_TXT[],stat,offset,"EKI:DatensatzB X=%7.2f,Y=%7.2f,Z=%7.2f,A=%7.2f,B=%7.2f,C=%7.2f ",EKI_B.X,EKI_B.Y,EKI_B.Z,EKI_B.A,EKI_B.B,EKI_B.C)
将多个浮点数据写入在USER_MSG.MSG_TXT[]字符串里.
SWRITE(USER_MSG.MSG_txt[],STATE, OFFSET, "TCP alt X=%.1F Y=%.1F Z=%.1F",TOOL_DATA[COR_TOOL_NO].x,TOOL_DATA[COR_TOOL_NO].y,TOOL_DATA[COR_TOOL_NO].z)
将TOOL_DATA的数据写入到字符串USER_MSG.MSG_txt[]里,用来显示TCP.
通过SWRITE的功能我们就可以实现了浮点数存入到字符串的功能.
SWRITE(USER_MSG.MSG_TXT[],STATE,OFFSET,"%s %s",sMeldFunction[],USER_MSG.MSG_TXT[])
将字符串写入到USER_MSG.MSG_TXT[]字符串里
通过SWRITE功能我实现了历史的突破!