0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

S71200:char和string的定义

机器人及PLC自动化应用 来源:机器人及PLC自动化应用 作者:机器人及PLC自动化 2022-04-01 11:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、char 和 string 的定义:

1、数据类型为 char (Character) 的变量长度为 8 bit 位,占用1个 byte 的内存。char 数据类型将单个字符存储为 ASCII 编码形式。

通常是指计算机中使用的字母、数字和符号,包括:1、2、3、A、B、C、常见符号等。每个字符占用空间为1字节。

2、数据类型为 string 的操作数可存储多个字符,最多可包括 254 个字符。字符串中的第一个字节为总长度,第二个字节为有效字符数量。

字符串(string)在存储上类似字符的数组,所以它每一个元素都是可以提取的字符,如:“abcdefg”叫字符串,而其中的每个元素叫字符。

二、char 和 string 在西门子 PLC 中的格式

例如,在 PLC 中创建一个 DB 块,并将属性设置为标准 DB 块,在 DB1 块中创建如下的字符串和字符,并赋予起始值。如下图所示:

63bf568e-b130-11ec-aa7f-dac502259ad0.png

图.01

1、string 数据类型的格式

下载到 PLC 中,通过监视表逐个查看每个字节中的值。如下图所示:

63d6445c-b130-11ec-aa7f-dac502259ad0.png

图.02

可以看出:

a.数据类型为 string 的字符串,通过查看 DB 块偏移地址可见该字符串占用256字节;查看字符串第一个字节,其最多存储字符总数量为254个。

b.数据类型为 string[10] 的字符串,通过查看 DB 块偏移地址可见该字符串占用12字节;查看字符串第一个字节,其最多存储字符数量为10个。

c.字符串的第一个字节为该字符串总长度,第二个字节为当前存储的有效字符数量。

2、char 和16进制数的关系

在计算机领域,所有的数据都是以2进制数存储的,那么 char,16进制数和2进制数又有什么关系?

如下图所示:

63fa0a22-b130-11ec-aa7f-dac502259ad0.png

图.03

可以看出:

a.通过字符 ‘A’ 的16进制数和2进制数,可见字符(char)、16进制数只是在 PLC 中显示的形式不同,实际存储的是一个2进制值。

b.通过字符 ‘1’ 和数值1(MB0的值)的16进制数和2进制数,可见字符 ‘1’ 和数值1是两种不同数据。因此,实际使用是必须注意区别。

c.下图是 ASCII 字符(char):‘0’,‘1’,……‘E’,‘F’ 对应的2进制,10进制,16进制对应关系的截图。

6417a3d4-b130-11ec-aa7f-dac502259ad0.png

图.04

更多的 ASCII 字符对应关系,请查看下面的链接。

ASCII 码表链接:ASCII

三、使用 string 数据类型在 HMI 上显示汉字

例如,在某些不支持 WString 数据类型(关于 WString 参见:跳转链接)的 HMI 设备上显示汉字,也是可以使用 string 数据类型显示的。

但由于 string 数据类型中存储的汉字编码标准为 GBK 编码;因此,需要在 HMI 设备上选择相应的编码标准。

如下图所示,在 string 数据类型的起始值中定义汉字 ‘你好’,且字符背景底色为浅黄色(编译时会有警告信息,这是TIA软件建议 string 数据类型中不使用汉字的友情提示),但不影响使用。

642d252e-b130-11ec-aa7f-dac502259ad0.png

图.05

在线监控时发现汉字无法按 Unicode 编码方式正确显示,设置显示格式为16进制数,通过下图所示的字符编码对应关系,发现其对应的是 GBK 编码。如下图所示:

64462088-b130-11ec-aa7f-dac502259ad0.png

图.06

所以,在 HMI 设备上显示 string 数据类型中存储的汉字时,需要在 HMI 上设置对应的 GBK 编码方式,是可以显示汉字的。

关于16进制数和 GBK 编码对应关系,可以通过如下网址查询:GBK

四、常问问题:

1、HTA 和 ATH 指令的输入和输出使用限制?

通过 TIA 软件的在线帮助,查看指令功能说明:

指令 HTA 功能——输入范围为16进制数:16#0,1,……E,F,输出范围为由 ASCII 字符(char):‘0’,‘1’,……‘E’,‘F’ 组成的数组或字符串 。

指令 ATH 功能——输入范围为由 ASCII 字符(char):‘0’,‘1’,……‘E’,‘F’ 组成的数组或字符串,输出范围为16进制数:16#0,1,……E,F 。

注意:指令 ATH 和指令 HTA 的输入和输出都是受到限制的。

2、HTA 和 ATH 指令的作用?

在具体的应用中需要互相转换字符(‘0’,‘1’,……‘E’,‘F’)和16进制数值(16#0,1,……E,F),那么HTA和ATH就为转换这两种类型的数据提供了方便。

以 HTA 指令为例,在 OB1 中调用 HTA 指令,实现如下要求的转换:

a.W#16#12AB需要转换为 ASCII 字符数组,使用 HTA 指令转换结果为 CHAR#[‘1’,‘2’,‘A’,‘B’]。

b.W#16#12AB需要转换为 ASCII 字符串,使用 HTA 指令转换结果为 ‘12AB’ 。

如下图所示:

645b762c-b130-11ec-aa7f-dac502259ad0.png

图.07

结果:使用 HTA 指令转换后,数据类型及占用字节空间发生了变化;同样的,使用 ATH 指令可以做反向转换,这里不再举例说明。

3、字符串存储的 ‘abcdef’,通过赋值更新为了 ‘DCBA’,为何查看字符存储单元时,字符 ‘e’ 和 ‘f’ 还能监视到?该如何处理?

简单测试程序,如下图所示:

6473414e-b130-11ec-aa7f-dac502259ad0.png

图.08

当M0.0触发之后,再触发M0.2,结果如下图所示:

64904a14-b130-11ec-aa7f-dac502259ad0.png

图.09

例子中,6字符的字符串更新为4字符的字符串,原字符串的后2个字符没有更新;倘若这10个字符的字符串需要通过串口或 TCP 通信完整(字符串总长12字节)的发送到通信伙伴,那么在字符串信息更新后的发送信息中将包含这两个不需要发送的字符。

结果:字符串更新时,仅更新有效字符数量的部分。

建议处理方法:更新字符串之前,先清空该字符串中所有字符。

4、如何输入特殊字符(如:回车,换行,$ 等)?

例如,需要输入的字符串为 ‘$ABCD$+回车+换行’,可以参考如下表格:

64a6d5d6-b130-11ec-aa7f-dac502259ad0.png

图.10

根据表格说明,字符串在 PLC 中的书写格式:‘$$ABCD$$$R$L’ 或 ‘$$ABCD$$$N’,如下图所示:

64bf84aa-b130-11ec-aa7f-dac502259ad0.png

图.11

------------------END----------------------

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • plc
    plc
    +关注

    关注

    5045

    文章

    14439

    浏览量

    483525
  • 西门子
    +关注

    关注

    98

    文章

    3271

    浏览量

    119740
  • 变量
    +关注

    关注

    0

    文章

    615

    浏览量

    29369

原文标题:S71200: char 和 string 的定义

文章出处:【微信号:gh_a8b121171b08,微信公众号:机器人及PLC自动化应用】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机串口调试的巧妙方法分享

    ,__FUNCTION__,__LINE__);//文件名、函数名、行号 void DBG_STRING(char *title, void *pvbuff, unsigned int u32Len
    发表于 11-21 06:28

    SCPI指令控制PLTS,代码示例

    StrViewName) {    string StrCmd;    char szCmd[128] = { 0 };    sprintf_s(szCmd, 128, ":IMPort '%
    的头像 发表于 11-03 14:59 125次阅读

    Modbus RTU转Profinet总线协议网关

    疆鸿智能JH-RTU-PN 网关实现 Modbus转Profinet 功能,能够实现Modbus接口仪表、变频器、综保、软启动器等设备接入到S71500、S71200、CPU315-2PN/DP
    的头像 发表于 09-18 14:49 329次阅读
    Modbus RTU转Profinet总线协议网关

    rt-thread studio怎么设置才能让char变量是真正的有符号类型?

    最近被一个bug折磨了3天,一路debug进来,发现最终的原因是,定义了一个char变量,但实际上是无符号的(代码期望该变量是有符号的)。 然后我检查了以下编译器如下的设置,发现很奇怪,无论是否勾选
    发表于 09-16 08:23

    西门子PLC通过稳联技术EtherCAT转Profinet网关连接baumuller伺服器的配置案例

    西门子PLC用稳联技术的EtherCAT转Profinet网关,连上baumuller伺服器的配置例子 本案例实现西门子S71200 PLC通过EtherCAT转Profinet网关
    的头像 发表于 08-14 16:49 478次阅读
    西门子PLC通过稳联技术EtherCAT转Profinet网关连接baumuller伺服器的配置案例

    plc以太网通讯模块实现:S7-200与S7-1200借PPI助力农业自动化发展

    一:S7-200与S71200 在某大型食品加工厂的生产线升级项目中,西门子S7-200与S7-1200的通讯难题一度成为制约生产效率提升的瓶颈。S
    的头像 发表于 08-14 09:41 365次阅读
    plc以太网通讯模块实现:<b class='flag-5'>S</b>7-200与<b class='flag-5'>S</b>7-1200借PPI助力农业自动化发展

    西门子S7-200与S7-1200通过PPI以太网模块通讯,赋能汽车制造行业发展

    在当今工业自动化领域,不同型号PLC之间的高效通讯至关重要。西门子S7200与S71200作为常用的可编程逻辑控制器,其通讯需求在众多工业项目中频繁出现,但是S7-200PLC作为经典的串口设备,其
    的头像 发表于 08-12 14:35 624次阅读
    西门子<b class='flag-5'>S</b>7-200与<b class='flag-5'>S</b>7-1200通过PPI以太网模块通讯,赋能汽车制造行业发展

    S71200PLC怎样通过IR615远程监控修改程序?

    通过IR615远程连接西门子S71200PLC,不知道怎样设置,怎样使用
    发表于 08-05 07:38

    【RA-Eco-RA6M4开发板评测】2、移植FreeRTOS_CLI和添加自定义指令

    = xValue1 + xValue2; // convert the result to a string char cResultString[10]; sprintf(cResultString
    发表于 07-23 11:34

    依托PPI以太网模块,西门子S7-200与S7-1200通讯助力食品加工行业进步

    在当今工业自动化领域,不同型号PLC之间的高效通讯至关重要。西门子S7200与S71200作为常用的可编程逻辑控制器,其通讯需求在众多工业项目中频繁出现,但是S7-200PLC作为经典的串口设备,其
    的头像 发表于 07-21 09:38 546次阅读
    依托PPI以太网模块,西门子<b class='flag-5'>S</b>7-200与<b class='flag-5'>S</b>7-1200通讯助力食品加工行业进步

    【RA4L1-SENSOR】4、移植FreeRTOS-CLI

    the result to a string char cResultString[10]; sprintf(cResultString,\"%d\",xResultValue
    发表于 06-26 22:30

    itop-3568开发板驱动开发指南-实验程序的编写

    number;//定义 int 类型变量 number 4、static char *name;//定义 char 类型变量 name 5、static int para[8];//
    发表于 05-19 10:26

    【道生物联TKB-620开发板试用】GPS模块定位数据发送端实现

    [0].string[modifyPos], str, strlen((char *)str)); xPos = show_param[screenIdx].screen_param[0
    发表于 04-27 22:29

    如何使用S32 Design Studio for ARM将自定义数据放入SRAM中以进行S32K146?

    如何使用 S32 Design Studio for ARM 将自定义数据放入 SRAM 中以进行S32K146?
    发表于 04-01 08:27

    MSC1210如何才能在程序中调用Boot ROM中的程序?

    获取ADC采样结果的程序long bipolar(void)在哪有定义? ROM.h文件内容如下: extern void put_string(char code *string
    发表于 01-01 07:57