Skip to main content

存储格式

本章介绍基于文件的存储格式。内容包括文件的文本编码、文件夹结构、编程对象及其元数据的存储,以及结构化文本和图形语言中的源文本。

文本编码和格式化

所有由……写入的文件都遵循相同的约定。CODESYS File-Based Storage这样可以保证项目在不同操作系统之间可移植,并在版本控制系统中创建清晰的差异。

  • 编码所有文本文件均以 UTF-8 编码写入,不包含字节顺序标记(BOM)。读取现有 XML 文件时,将使用指定的编码。字节顺序标记可以容忍。

  • 行尾文件写入时会使用换行符(\n读取文件时,换行符和 Windows 行尾符都会被读取(\r\n)被接受。

    版本控制系统中的行尾

    配置版本控制系统,使换行符保留为行尾,以避免不必要的差异。

  • 缩进 JSON 和 XML 文件每嵌套一级缩进一个制表符。

文件夹

项目树中的每个文件夹都会成为一个同名目录。文件夹可以选择性地包含一个名为“metadata”的元数据文件。.folder_meta.json此文件存储文件夹的对象 GUID 及其属性:

{
	"objectGuid": "1b3a0c5e-...",
	"properties": {
		"PropertyName": "PropertyValue"
	}
}

CODESYS 3每个文件夹都有一个对象 GUID。该 GUID 写入到…….folder_meta.json文件应确保即使在重命名和移动文件夹后,仍然可以对其进行跟踪。properties仅当文件夹具有属性时,才会写入该字段。否则,该字段将被省略。CODESYS 4文件夹没有对象 GUID。没有保存元数据的文件夹没有.folder_meta.json文件。

编程对象

每个编程对象都保存为一个单独的文本文件。文件名遵循以下语法:

<object name>.<class>.<language>

类部分指定对象类型,语言部分指定实现语言。具体来说,结构化文本的语言部分是:st结构化文本中功能块的一个例子是:Timer.fb.st

对象类型

类部分

例子

程序

prg

Main.prg.st

功能块

fb

Timer.fb.st

功能

fn

Add.fn.st

方法

meth

Start.meth.st

行动

act

Reset.act.st

过渡

trans

Step1.trans.st

POU 的财产

prop.st

Enabled.prop.st

界面

itf

IMotor.itf

接口方法

meth

Run.meth

接口属性

prop

Speed.prop

结构(DUT)

struct

Point.struct

枚举(DUT)

enum

Color.enum

别名(DUT)

alias

Distance.alias

工会(DUT)

union

Value.union

全局变量列表

gvl

Globals.gvl

包含子对象(例如,包含方法的函数块)的对象存储为一个目录,该目录的名称以插入符号 ( ) 结尾。^对象本身就是此目录中的文件。其子对象位于该文件旁边:

Timer.fb.st^/
    Timer.fb.st    (der Funktionsbaustein selbst)
    Start.meth.st    (eine Methode)
    Stop.meth.st    (eine Methode)

对象元数据

如果对象包含无法以其他方式重建的元数据,则该文件以元数据注释开头。例如,稳定的对象 GUID 或对象属性。注释以标记。(* METADATA … *)元数据以 JSON 格式存储。

(* METADATA
{
	"v3Meta": {
		"objectGuid": "e75fc257-..."
	}
}
*)

如果对象不包含元数据,则不会写入元数据注释,文件直接以对象头开始。

项目信息(标题、版本、作者、公司、描述和其他设置)存储在……ProjectInfo.json项目根目录中的文件。

结构化文本中对象的源文本

结构化文本以纯文本形式存储,不带任何标记。声明部分总是写在最前面,紧接着是实现部分。

1. 例子

以下示例展示了结构化文本PLC_PRG项目中PLC_PRG.prg.st文件。

PROGRAM PLC_PRG
VAR
    nCounter : INT;
END_VAR
nCounter := nCounter + 1;
END_PROGRAM


图形语言的源文本

除了结构化文本之外的其他语言——图形语言,例如梯形图(LD)、功能块图(FBD)连续函数图代码功能图 (CFC) 和顺序功能图 (SFC) 不能用结构化文本编写。对于这些语言,声明仍然以纯文本形式存储。但是,实现部分会被两条标记线括起来,分别引用相应的语言。

FUNCTION_BLOCK TSSend
VAR_INPUT
    xExecute : BOOL;
END_VAR
__BEGIN_IMPLEMENTATION('CFC')
{
    ... die Implementierung im eigenen Format der Sprache ...
}
__END_IMPLEMENTATION
END_FUNCTION_BLOCK

实施过程从标记开始。__BEGIN_IMPLEMENTATION('<language>')引用该语言(例如,LD对于梯形图,FBD对于功能框图,CFC对于连续函数图,或SFC(例如,顺序功能图)。它将用标记关闭。__END_IMPLEMENTATION标记之间的所有内容均以相应语言的文本格式存储。对于集成的图形语言,此格式为 JSON,每嵌套一层缩进一个制表符。

这些标记确保声明部分与实现部分的内容可靠地分离,而与实现部分的内容无关。结构化文本否标记。

没有原生格式的对象

并非所有对象类型都有自己的文本表示形式。例如,设备配置和任务配置等对象会保存在扩展名为 .swap 的交换文件中。xml.v3其中包含了原件CODESYS序列化。这些文件仍然是文本文件,因此在版本控制系统中仍会产生逐行差异。一旦有原生格式可用,这类对象就可以迁移到原生格式。

更多信息请参见以下内容:迁移对象

如果一个对象的内容完全无法解释,那么该对象保持不变,因此不会丢失任何信息。