文章目录

  • 1、需要安装的组件
  • 2、Tc2_TcXmlDataSrv中的四个功能块
    • 2.1 FB_XmlSrvRead
    • 2.2 FB_XmlSrvReadByName
    • 2.3 FB_XmlSrvWrite
    • 2.4 FB_XmlSrvWriteByName
  • 3、支持的数据类型
  • 4、四个功能块使用demo
    • 4.1 Sample 1 (FB_XmlSrvWrite)
    • 4.2 Sample 2 (FB_XmlSrvWriteByName)
    • 4.3 Sample 3 (FB_XmlSrvRead)
    • 4.4 Sample 4 (FB_XmlSrvReadByName)
  • 5、 实际使用demo
    • 5.1 程序启动时的初始化
    • 5.2 循环和事件驱动的打印过程

TwinCAT XML服务器提供了一个PLC库,可以实现对XML数据的写/读访问。XML服务器的特点是易于处理。它特别适合于加载初始化数据,因此通常需要它来启动机器。XML服务器通过ADS与TwinCAT PLC通信。

  • 在写入过程中,变量将被转换成文本,并通过MSXML DOM解析器存储在XML文件中。XML文件不包含任何关于数据类型的信息,只包含变量名及其值:<name_of_variable> value </name_of_variable>。
  • 在读取过程中,将通过ADS确定每个变量的数据类型,相应的XML文本将被正确地转换。

1、需要安装的组件

  1. TwinCAT XML Server:随TwinCAT一起启动,用于TwinCAT和XML文件之间的连接。
  2. PLC 库:提供了读写操作的四个功能块。允许在XML文件中格式化保存PLC变量,并使用XML文件中的数据初始化TwinCAT变量。

:TwinCAT XML Server可以在官网下载安装(TF6421-XML-Server);PLC 库需要在项目中手动添加。如图所示,已经在系统中安装好了TF6421,以及在项目中的references添加了Tc2_XmlDataSrv,这时就可以使用xml功能了。


2、Tc2_TcXmlDataSrv中的四个功能块

Tc2_TcXmlDataSrv库中有四个读/写xml的功能块,包括两个读(FB_XMLSrvRead, FB_XMLSrvReadByName)和两个写(FB_XMLSrvWrite, FB_XMLSrvWriteByName)。

(FB_XMLSrvRead, FB_XMLSrvWrite)使用PLC变量的地址和大小来指定变量。(FB_XMLSrvReadByName, FB_XMLSrvWriteByName)使用符号名来指定变量。前者具有更高的性能。此外,XML文件的路径和XML文档中变量的位置必须作为输入参数传递给函数块。

2.1 FB_XmlSrvRead

2.2 FB_XmlSrvReadByName

2.3 FB_XmlSrvWrite

2.4 FB_XmlSrvWriteByName

  • sNetId:包含TwinCAT 3 XML Server的网络地址的字符串。对于本地计算机(默认),可以指定一个空字符串。
  • epath:用于在目标设备上选择打开文件的TwinCAT系统路径。
  • nMode:用于控制XML文件的计算方式。XmlSrvRead (同 XmlSrvReadByName)命令只支持 XMLSRV_SKIPMISSING 模式。XmlSrvWrite (同 XmlSrvWriteByName)可以使用 XMLSRV_SKIPMISSINGXMLSRV_ADDMISSING 模式。在 XMLSRV_SKIPMISSING 模式下,只有那些已经存在于XML文件中的PLC符号的子元素被写入XML文件。在XMLSRV_ADDMISSING模式中,将缺失的子元素添加到XML文件中。
  • pSymAddr:将XML文件中的数据写入的PLC变量的地址。
  • cbSymSize:将XML文件中的数据写入的PLC变量的大小。
  • sFilePath:要打开的文件的路径和文件名。该路径只能指向本地计算机的文件系统。
  • sXPath:要从XML文档中写入数据的的标记地址。地址必须是有效的XPath指令。标记的名称不能与符号的名称相同。
  • bExecute:激活功能块的标志位,true=激活。
  • tTimeout:功能块执行的最大时间。

3、支持的数据类型

4、四个功能块使用demo

定义两个结构体:

TYPE ST_MYSTRUCT:
STRUCTfReal : REAL;bBool : ARRAY [0..2] OF BOOL;stInner : ST_INNTERSTRUCT;
END_STRUCT
END_TYPE
TYPE ST_INNTERSTRUCT:
STRUCTnInteger : INT;sString : STRING;
END_STRUCT
END_TYPE

4.1 Sample 1 (FB_XmlSrvWrite)

PROGRAM MAIN
VARvalue1 : ST_MyStruct;fbXmlSrvWrite : FB_XmlSrvWrite;bExecute : BOOL;sFilePath : T_MaxString := D:\demo\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VARfbXmlSrvWrite(nMode := XMLSRV_ADDMISSING,pSymAddr := ADR(value1),cbSymSize := SIZEOF(value1),sFilePath := sFilePath,sXPath := sXPath,bExecute := bExecute
);
bExecute := TRUE;

4.2 Sample 2 (FB_XmlSrvWriteByName)

PROGRAM MAIN
VARvalue1 : ST_MyStruct;fbXmlSrvWrite : FB_XmlSrvWriteByName;bExecute : BOOL;sSymName : T_MaxString := 'MAIN.value1';sFilePath : T_MaxString := 'D:\demo\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VARfbXmlSrvWrite(nMode := XMLSRV_ADDMISSING,sSymName := sSymName,sFilePath := sFilePath,sXPath := sXPath,bExecute := bExecute
);
bExecute:= TRUE;

4.3 Sample 3 (FB_XmlSrvRead)

PROGRAM MAIN
VARvalue1 : ST_MyStruct;fbXmlSrvRead : FB_XmlSrvRead;bExecute : BOOL;sFilePath : T_MaxString := 'D:\demo\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VARfbXmlSrvRead(pSymAddr := ADR(value1),cbSymSize := SIZEOF(value1),sFilePath := sFilePath,sXPath := sXPath,bExecute := bExecute
);
bExecute:= TRUE;

4.4 Sample 4 (FB_XmlSrvReadByName)

PROGRAM MAIN
VARvalue1 : ST_MyStruct;fbXmlSrvRead : FB_XmlSrvReadByName;bExecute : BOOL;sSymName : T_MaxString := 'MAIN.value1';sFilePath : T_MaxString := 'D:\demo\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)sXPath : T_MaxString := '/dataentry/MAIN.value1';
END_VARfbXmlSrvRead(sSymName := sSymName,sFilePath := sFilePath,sXPath := sXPath,bExecute := bExecute
);
bExecute:= TRUE;

5、 实际使用demo

5.1 程序启动时的初始化

PROGRAM MAIN
VARvalue1 : ST_MyStruct;fbXmlSrvRead : FB_XmlSrvRead;bExecute : BOOL;sFilePath : T_MaxString := 'D:\demo\Test.xml'; (* CE: '\Hard Disk\Test.xml' *)sXPath : T_MaxString := '/dataentry/MAIN.value1';nState : INT := 0;
END_VARCASE nState OF
0: (* initialize *)fbXmlSrvRead(pSymAddr := ADR(value1),cbSymSize := SIZEOF(value1),sFilePath := sFilePath,sXPath := sXPath,bExecute := bExecute);fbXmlSrvRead(bExecute:= TRUE);nState:= 1;
1: (* wait for read operation *)fbXmlSrvRead(bExecute:= FALSE);IF NOT fbXmlSrvRead.bBusy AND NOT fbXmlSrvRead.bError THENnState:= 2;ELSIF fbXmlSrvRead.bError THENnState:= 100;END_IF
2: (* operations *)
;
100:(* errorState *)
;
END_CASE

5.2 循环和事件驱动的打印过程

PROGRAM Sample6
VARvalue1 : ST_MyStruct;fbXmlSrvWrite : FB_XmlSrvWrite;sFileFolder : T_MaxString :='C:\'; (* CE: '\Hard Disk\' *)sFileName : T_MaxString:= '_test.xml';sFilePathWrite : T_MaxString(*sFilePathWrite = sFileFolder + time + sFileName*)sXPathWrite : T_MaxString :='/dataentry/MAIN.value1';ntGetTime : NT_GetTime;stMyTimestruct : TIMESTRUCT;iState : INT := 1;bTwentySec : BOOL:= FALSE;bButton : BOOL:= FALSE;bTwentySecOver : BOOL;triggerWrite : R_TRIG;triggerButton : R_TRIG;
END_VARtriggerButton(CLK:= bButton);
CASE iState OF
0: (* idle state *)
;
1: (* initialize *)fbXmlSrvWrite(nMode:=XMLSRV_ADDMISSING, pSymAddr:= ADR(value1),cbSymSize:= SIZEOF(value1));ntGetTime(START:= TRUE, TIMESTR=>stMyTimestruct); (* get Windows time *)IF NOT ntGetTime.BUSY AND NOT ntGetTime.ERR THENiState:= 2;ELSIF ntGetTime.ERR THENiState:= 100;END_IF
2: (* working state *)(* change some values - replace with production-process *)value1.stInner.nInteger:= value1.stInner.nInteger + 1;IF value1.stInner.nInteger = 32767 THENvalue1.stInner.nInteger:= 0;END_IF(* get Windows time *)ntGetTime(START:= FALSE);IF NOT ntGetTime.BUSY AND NOT ntGetTime.ERR THENntGetTime(START:= TRUE, TIMESTR=>stMyTimestruct);ELSIF ntGetTime.ERR THENiState:= 100;END_IF(* check if 20s have passed*)IF stMyTimestruct.wSecond = 0 OR stMyTimestruct.wSecond = 20 OR stMyTimeStruct.wSecond = 40 THENbTwentySecOver:= TRUE;ELSEbTwentySecOver:= FALSE;END_IF(* if 20s have passed => trigger writing-process *)triggerWrite(CLK:=bTwentySecOver);IF (triggerWrite.Q OR triggerButton.Q) AND NOT fbXmlSrvWrite.bBusy AND NOT fbXmlSrvWrite.bError THEN(* create filename *)sFilePathWrite:= CONCAT(sFileFolder, SYSTEMTIME_TO_STRING(stMyTimestruct)); (* set folder + time *)sFilePathWrite:= DELETE(STR:= sFilePathWrite, LEN:= 4 , POS:= LEN(STR:=sFilePathWrite)-3); (*delete milliseconds *)sFilePathWrite:= REPLACE(STR1:= sFilePathWrite , STR2:= '.' , L:= 1,P:= LEN(STR:=sFilePathWrite)-2); (* replace colon with point *)sFilePathWrite:= REPLACE(STR1:= sFilePathWrite , STR2:= '.' , L:= 1,P:= LEN(STR:=sFilePathWrite)-5); (* replace colon with point *)sFilePathWrite:= CONCAT(sFilePathWrite, sFileName); (* add filename (default: test) *)(*change value 1*)value1.stInner.sString := sFilePathWrite;value1.stInner.nInteger := stMyTimestruct.wSecond;(* write *)fbXmlSrvWrite(sFilePath:=sFilePathWrite, sXPath:=sXPathWrite, bExecute:= TRUE);ELSIF fbXmlSrvWrite.bError THENiState:= 100;END_IF(* reset fbXmlSrvWrite *)IF fbXmlSrvWrite.bBusy AND NOT tGetTime.ERR THENfbXmlSrvWrite(bExecute:= FALSE);ELSIF ntGetTime.ERR THENiState:= 100;END_IF
100: (* error state*)
;
END_CASE

【1】https://www.beckhoff.com/en-en/products/automation/twincat/tfxxxx-twincat-3-functions/tf6xxx-tc3-connectivity/tf6421.html

TwinCAT 3 使用XML-server相关推荐

  1. 【Servlet】Tomcat公共 / 项目独立的 web.xml / server.xml 文件讲解

    课程介绍 每个web 项目下都具备web.xml 文件.通过前面的学习,我们对web.xml 文件有了一定了解,但是还不够,本节课就web.xml 文件进行总结.同时对Tomcat 下的server. ...

  2. Docker Centos 7.X部署Tomcat 并且修改Server.xml配置文件方案 并设置时区 只要十一步

    我用的是腾讯云 Centos 7.3版本,使用Docker最好使用7.x以上版本 1.拉取镜像 docker pull tomcat:8 2.创建容器并且挂载webapps的目录(我这里将本地端口映射 ...

  3. Tomcat server.xml配置示例

    转载自    Tomcat server.xml配置示例 几乎所有容器类型的应用都会包含一个名为 server.xml 的文件结构.基本上,其中的每个元数据或者配置都是容器完成初始化所需要的.正是由于 ...

  4. Tomcat(二):server.xml配置

    一.server.xml详解 Tomcat各组件关系图 ​ 1.Server ​ server.xml的最外层元素. 常用属性: ​ port:Tomcat监听shutdown命令的端口. ​ shu ...

  5. XPC调试记录 :TwinCAT生成XML配置文件

    XPC调试记录:生成XML配置文件20210316 1.连接目标控制器 硬件准备:用一根网线将配置有EtherCAT的电脑和EK1100(BECOHOFF总线模块)网线插槽X2(OUT)相连.(正常初 ...

  6. TWINCAT3中使用FIFO收集三轴的位置信息,XML文件的生成,解决常见报错

    TWINCAT3中使用FIFO收集三轴的位置信息,XML文件的生成,解决常见报错 1.首先到官网下载程序 很多时候我们用twincat不具备硬件条件,需要用到虚轴进行测试,但是对于初学者来说,用twi ...

  7. Go 语言 XML处理

    介绍 XML 应用于 web 开发的许多方面,常用于简化数据的存储和共享. 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言, ...

  8. 查找xml文件中某接点的值

    <?xml   version="1.0"   encoding="GB2312"?>       <MaterialClasses>  ...

  9. go标准库的学习-encoding/xml

    参考:https://studygolang.com/pkgdoc 导入方式: import "encoding/xml" 实现的简单的理解XML命名空间的XML 1.0编译器 f ...

  10. .net操作xml小结 (转)

    .net操作xml小结 一.简单介绍 using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument(); //导入指定xml文件 xml ...

最新文章

  1. Yahoo网站性能优化的34条规则
  2. 使用lucene进行group操作
  3. docker linux界面版,centos 7 Docker使用Portainer搭建可视化界面
  4. boost log 能不能循环覆盖_记一次for循环中let是声明还是赋值
  5. vue 动态变量名_【告别复制粘贴】动态模板生成小技巧
  6. 智能实验室-全能优化(Guardio) 4.94.0.830
  7. 自动化测试基础篇--Selenium弹出框alert
  8. FFmpeg滤镜代码级分析
  9. 使用jpeglib直接把NV12转为jpeg文件的代码
  10. 400多款微信公众号小游戏源码集合源码
  11. android+3.1.2+imagebutton监听,android Button ImageButton 差别
  12. 爬虫之模拟登录、自动获取cookie值、验证码识别
  13. HTML 静态网页制作Web 金州勇士队 库里 库里三分王 JavaScript CSS 图片轮播 时间效果 注册界面等
  14. 条形码编码规则及标准
  15. 1vcpu等于几核?vcpu是什么意思
  16. iphone双重认证关闭不了怎么办_Apple id双重认证,没有关闭的选项?
  17. 微软招 HR 了!看来是招聘需求太旺盛,忙不过来了
  18. logstash-plugin install报错message: certificate verify failed
  19. msp430g2553串口接受数据_msp430g2553的串口发送程序
  20. nagios mail告警通知

热门文章

  1. 如何将计算机桌面屏幕放大,如何放大电脑屏幕画面?这些方法你都知道吗
  2. openstack-packstack一键式在线部署
  3. 修改SLK数据 的一些基础
  4. GoLand 连接远程代码库
  5. 直流电机单闭环调速matlab仿真,单闭环直流电机调速Simulink仿真.docx
  6. 《给QTreeView表项添加右键菜单》:系列教程之四
  7. 微信公众号如何开通支付功能?
  8. 获取上周第一天,最后一天
  9. java实现冒泡算法
  10. abb机器人伺服电机报闸是什么_abb伺服电机究竟怎么样呢?