如何使用 STR_CPY 指令(常见于 PLC 编程,如西门子 S7-1200/1500 的 TIA Portal)将汉字转换成对应的 16 进制(16#)数值,核心是先获取汉字的字符编码(如 Unicode/GBK),再通过指令提取编码并转换为 16 进制格式。
一、核心原理:汉字的编码与 16 进制表示
汉字的编码基础:
中文汉字在 PLC 中通常以Unicode(UTF-16) 编码存储,一个汉字对应 2 个字节(16 位),即一个 16 进制数(范围 16#4E00 ~ 16#9FA5,覆盖常用简体汉字)。
例如:“中” 的 Unicode 编码是 U+4E2D,对应 PLC 中的 16 进制就是 16#4E2D;“国” 是 U+56FD,对应 16#56FD。
STR_CPY 的作用:
STR_CPY(字符串复制)本身不直接转换编码,但可以提取字符串中的汉字字符,再通过CHAR_TO_INT(字符转整数)指令获取字符的 Unicode 编码值,最终以 16 进制形式呈现。
二、PLC(西门子 S7-1200/1500)实现步骤
以下是 TIA Portal 中完整的编程示例,以 “中” 字为例,将其转换为 16#4E2D:
1. 定义变量(变量表)
| 变量名 | 数据类型 | 说明 |
|---|---|---|
| s_Chinese | String[2] | 存储要转换的汉字(如 “中”) |
| i_CharCode | Int | 存储汉字的 Unicode 编码值 |
| s_HexResult | String[6] | 存储 16 进制结果(如 "16#4E2D") |
2. 编写梯形图 / 结构化文本(ST)代码
推荐用结构化文本(ST),逻辑更清晰:
st
// 步骤1:赋值要转换的汉字 s_Chinese := '中'; // 步骤2:提取第一个字符(汉字)的Unicode编码(CHAR转INT) // STR_CPY先确保字符被正确提取,再取第1个字符(索引从1开始) STR_CPY( IN := s_Chinese, // 输入字符串:"中" LEN := 1, // 提取长度:1个字符(汉字占1个字符位,2个字节) POS := 1, // 提取位置:第1个字符 OUT => s_Chinese // 输出:确保只保留目标字符 ); // 步骤3:将字符转换为整数(即Unicode编码值) i_CharCode := CHAR_TO_INT(s_Chinese[1]); // 步骤4:将整数编码转换为16进制字符串(拼接"16#"前缀) // INT_TO_STRING:将整数转为十进制字符串,再通过HEX指令转16进制 s_HexResult := '16#' + HEX(IN := i_CharCode, LEN := 4); // 最终结果:s_HexResult = "16#4E2D"
3. 关键指令解释
STR_CPY(IN, LEN, POS, OUT):提取字符串中指定位置、指定长度的字符,确保只处理目标汉字(避免多字符干扰)。例如POS:=1, LEN:=1表示提取第 1 个字符。CHAR_TO_INT(CHAR):将字符(CHAR)转换为对应的 Unicode 编码整数。例如CHAR_TO_INT('中')会返回十进制数20013,而20013的 16 进制就是4E2D。HEX(IN, LEN):将整数转换为指定长度的 16 进制字符串。HEX(20013, 4)会返回"4E2D",拼接"16#"后就是 PLC 标准的 16 进制格式。
4. 多汉字批量转换示例
如果要转换多个汉字(如 “中国”),只需循环提取每个字符:
st
// 批量转换"中国"为16#4E2D、16#56FD s_Chinese := '中国'; // 转换第1个字符"中" STR_CPY(IN:=s_Chinese, LEN:=1, POS:=1, OUT=>s_Chinese); i_CharCode := CHAR_TO_INT(s_Chinese[1]); s_HexResult := '16#' + HEX(i_CharCode, 4); // 结果:16#4E2D // 转换第2个字符"国" STR_CPY(IN:='中国', LEN:=1, POS:=2, OUT=>s_Chinese); i_CharCode := CHAR_TO_INT(s_Chinese[1]); s_HexResult := '16#' + HEX(i_CharCode, 4); // 结果:16#56FD
三、注意事项
编码格式:
西门子 PLC 默认使用 Unicode(UTF-16),如果你的系统用 GBK 编码,需先转换编码(可通过第三方库或自定义函数)。
确保 PLC 的字符串变量足够长:1 个汉字占
String的 1 个字符位(2 个字节),例如存储 n 个汉字需定义String[n]。指令兼容性:
STR_CPY在不同 PLC 品牌中名称可能不同(如三菱 FX 系列为STRCPY),但逻辑一致:先提取字符,再转编码。如果 PLC 不支持
HEX指令,可手动将整数转换为 16 进制(通过除 16 取余法)。验证方法:转换后可通过 PLC 的监控表查看变量:
i_CharCode(“中”)的十进制值应为20013;s_HexResult应为"16#4E2D",可直接用于 PLC 的 16 进制运算。
总结
使用
STR_CPY提取字符串中的目标汉字字符,确保只处理单个汉字;通过
CHAR_TO_INT将汉字字符转为 Unicode 编码的十进制整数;用
HEX指令将整数转为 16 进制字符串,拼接16#前缀得到最终结果;核心是利用 “汉字→Unicode 编码→16 进制” 的转换逻辑,
STR_CPY负责精准提取字符,是转换的前置步骤。

