plcopen-go
IEC 61131-3 PLCopen XML 的 Go 类型库,由 XSD 生成结构并支持 XML/JSON 序列化。
01 / PROJECT OVERVIEW
项目研究解读
IEC 61131-3 PLCopen XML 的 Go 类型库,由 XSD 生成结构并支持 XML/JSON 序列化。 本仓库以 JavaScript 为主要技术栈,当前快照索引 23 个文件。报告依据README 与目录结构整理,重点呈现项目用途、工程结构和复用方式,不把宣传描述等同于验证结论。
02 / CORE CAPABILITIES
值得关注的能力
- 01
围绕“IEC 61131-3 PLCopen XML 的 Go 类型库,由 XSD 生成结构并支持 XML/JSON 序列化”提供公开实现或研究资料
- 02
以 JavaScript 为主,保留 23 个可检查仓库文件
- 03
提供原始 GitHub 链接、目录导览和本地研究快照,便于复核与二次开发
03 / ENGINEERING
工程与仓库结构
仓库以 JavaScript 为主要实现语言,研究快照包含 23 个文件、8 个主要顶层入口。已提供 README 作为使用与能力说明。 项目最近更新时间为 2026-09-04,许可标记为 MIT License。
项目文件与实现资料
项目文件与实现资料
项目文件与实现资料
设计文档、研究记录或项目配图
项目文件与实现资料
项目文件与实现资料
04 / USE CASES
适合用在哪里
- 学习项目设计与实现
- 评估后用于二次开发
- 作为相关领域的研究参考
05 / QUICK START
从仓库开始
以下命令摘自项目 README 或根据仓库地址生成。请先阅读源仓库的安装要求、许可和脚本,再在自己的环境中运行。
git clone https://github.com/suifei/plcopen-go.git
cd plcopen-go06 / REPOSITORY MAP
目录证据导览
这里列出快照中的前 23 个索引文件中的代表路径,帮助你快速定位源码、文档、测试与资源。
.gitignoreCHANGELOG.mdLICENSEREADME.mddocs/TC6_XML_V10.xsddocs/TC6_XML_V101.pdfdocs/TC6_XML_V10_B.xsdgo.modtc6_xml_v10_b.gotests/body_types_test.gotests/data_types_test.gotests/formatted_text_test.gotests/interface_values_test.gotests/json_serialization_test.gotests/tc6_xml_v10_b_test.gotests/type_coverage_test.gotests/xml_validator_test.gotests/xsd-gen/TC6_XML_V10_B.cstests/xsd-gen/TC6_XML_V10_B.jstests/xsd-gen/TC6_XML_V10_B.vbutils/file_utils.goutils/marshal.goutils/validate_types_coverage.go
07 / SOURCE NOTES
README 原文摘录
保留原始说明便于复核。中文研究结论以当前快照为依据,后续变化请以 GitHub 仓库为准。
PLCopen-Go
一个用于处理 IEC 61131-3 PLCopen XML 格式的 Go 库,支持从 XSD 模式生成的完整结构体定义。
[[图片] Go Version](https://golang.org/dl/) [[图片] License](LICENSE) [[图片] Go Report Card](https://goreportcard.com/report/github.com/suifei/plcopen-go) [[图片] Changelog](CHANGELOG.md)
功能特性
- 🔧 完整的 PLCopen XML TC6 V1.0B 标准支持
- 📝 从 XSD 模式自动生成的 Go 结构体
- ✅ XML 模式验证支持
- 🛠️ 丰富的工具函数和实用程序
- 📊 全面的测试覆盖率
- 🌐 支持多种编程语言(ST、FBD、LD 等)
- 🔄 支持 XML 和 JSON 双重序列化格式
安装
go get github.com/suifei/plcopen-go快速开始
创建 PLCopen 项目
package main
import (
"encoding/xml"
"fmt"
"time"
"github.com/suifei/plcopen-go"
)
func main() {
// 创建项目
project := &plcopen.Project{
FileHeader: &plcopen.ProjectFileHeader{
CompanyName: "Your Company",
ProductName: "Your Product",
ProductVersion: "1.0",
ContentDescription: "PLCopen XML project",
CreationDateTime: time.Now(),
},
ContentHeader: &plcopen.ProjectContentHeader{
Name: "MyProject",
Version: "1.0",
Organization: "Your Organization",
Author: "Your Name",
Language: "en",
},
}
// 序列化为 XML
xmlData, err := xml.MarshalIndent(project, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(xmlData))
}解析 PLCopen XML 文件
package main
import (
"encoding/xml"
"github.com/suifei/plcopen-go"
"github.com/suifei/plcopen-go/utils"
)
func main() {
// 读取 XML 文件
xmlContent, err := utils.ReadFile("project.xml")
if err != nil {
panic(err)
}
// 解析 XML
var project plcopen.Project
err = xml.Unmarshal([]byte(xmlContent), &project)
if err != nil {
panic(err)
}
// 访问项目信息
fmt.Printf("项目名称: %s\n", project.ContentHeader.Name)
fmt.Printf("公司名称: %s\n", project.FileHeader.CompanyName)
}JSON 序列化支持
package main
import (
"encoding/json"
"fmt"
"time"
"github.com/suifei/plcopen-go"
)
func main() {
// 创建项目
project := &plcopen.Project{
FileHeader: &plcopen.ProjectFileHeader{
CompanyName: "Your Company",
ProductName: "Your Product",
ProductVersion: "1.0",
ContentDescription: "PLCopen JSON project",
CreationDateTime: time.Now(),
},
ContentHeader: &plcopen.ProjectContentHeader{
Name: "MyProject",
Version: "1.0",
Organization: "Your Organization",
Author: "Your Name",
Language: "en",
},
}
// 序列化为 JSON
jsonData, err := json.MarshalIndent(project, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(jsonData))
// 从 JSON 反序列化
var newProject plcopen.Project
err = json.Unmarshal(jsonData, &newProject)
if err != nil {
panic(err)
}
fmt.Printf("反序列化后的项目名称: %s\n", newProject.ContentHeader.Name)
}项目结构
plcopen-go/
├── tc6_xml_v10_b.go # 主要的结构体定义
├── utils/ # 工具函数
│ ├── file_utils.go # 文件操作工具
│ ├── marshal.go # 序列化工具
│ └── validate_types_coverage.go
├── tests/ # 测试文件
│ ├── tc6_xml_v10_b_test.go
│ ├── xml_validator_test.go
│ └── ...
├── docs/ # 文档和 XSD 文件
│ ├── TC6_XML_V10_B.xsd
│ └── TC6_XML_V101.pdf
└── go.mod支持的 PLCopen 元素
项目结构
- [
Project](tc6_xml_v10_b.go) - 根项目元素 - [
ProjectFileHeader](tc6_xml_v10_b.go) - 文件头信息 - [
ProjectContentHeader](tc6_xml_v10_b.go) - 内容头信息 - [
ProjectTypes](tc6_xml_v10_b.go) - 类型定义 - [
ProjectInstances](tc6_xml_v10_b.go) - 实例配置
编程语言支持
- ST (Structured Text) - 结构化文本
- FBD (Function Block Diagram) - 功能块图
- LD (Ladder Diagram) - 梯形图
- IL (Instruction List) - 指令表
- SFC (Sequential Function Chart) - 顺序功能图
数据类型
- 基本数据类型 (BOOL, INT, REAL 等)
- 用户定义的数据类型
- 数组和结构体
- 枚举类型
工具函数
文件操作
import "github.com/suifei/plcopen-go/utils"
// 读取文件
content, err := utils.ReadFile("project.xml")
// 写入文件
err = utils.WriteFile("output.xml", xmlContent)
// 检查文件是否存在
exists := utils.FileExists("project.xml")
// 读取文件行
lines, err := utils.ReadFileLines("config.txt")测试
运行所有测试:
go test ./...运行特定测试:
go test ./tests -v运行 XML 验证测试:
go test ./tests -run TestXMLSchemaValidation -v验证
该库包含全面的 XML 模式验证功能,确保生成的 XML 符合 PLCopen 标准:
- XML 格式验证
- 命名空间验证
- 结构完整性验证
- 类型覆盖率测试
详见 [xml_validator_test.go](tests/xml_validator_test.go) 中的验证测试。
示例
查看 [tests](tests/) 目录中的各种示例:
- [
tc6_xml_v10_b_test.go](tests/tc6_xml_v10_b_test.go) - 基本项目创建和序列化 - [
xml_validator_test.go](tests/xml_validator_test.go) - XML 验证示例 - [
data_types_test.go](tests/data_types_test.go) - 数据类型使用示例
API 文档
完整的 API 文档请访问:GoDoc
贡献
欢迎贡献代码!请遵循以下步骤:
- Fork 本项目
- 创建功能分支 (
git checkout -b feature/amazing-feature) - 提交更改 (
git commit -m 'Add some amazing feature') - 推送到分支 (
git push origin feature/amazing-feature) - 创建 Pull Request
许可证
本项目采用 MIT 许可证 - 详见 LICENSE 文件。
相关资源
版本历史
查看项目的详细更新历史和版本说明,请参考:CHANGELOG.md
致谢
感谢 PLCopen 组织提供的 XML 交换格式标准,使得工业自动化项目之间的互操作性成为可能。
如果您觉得这个项目有用,请给它一个 ⭐!

