plcopen-go

IEC 61131-3 PLCopen XML 的 Go 类型库,由 XSD 生成结构并支持 XML/JSON 序列化。

plcopen-go 项目封面或真实界面
JavaScript主要技术栈
3GitHub Stars
2Forks
23索引文件
MIT License许可标记
2026-09-04最近更新

01 / PROJECT OVERVIEW

项目研究解读

IEC 61131-3 PLCopen XML 的 Go 类型库,由 XSD 生成结构并支持 XML/JSON 序列化。 本仓库以 JavaScript 为主要技术栈,当前快照索引 23 个文件。报告依据README 与目录结构整理,重点呈现项目用途、工程结构和复用方式,不把宣传描述等同于验证结论。

automationcontrol-systemsfunction-block-diagramsgo-libraryiec-61131-3industrial-automationjson-serializationladder-diagrammanufacturingplc-programmingplcopenstructured-textxml-parserxml-schemaxsd-validation

02 / CORE CAPABILITIES

值得关注的能力

  1. 01

    围绕“IEC 61131-3 PLCopen XML 的 Go 类型库,由 XSD 生成结构并支持 XML/JSON 序列化”提供公开实现或研究资料

  2. 02

    以 JavaScript 为主,保留 23 个可检查仓库文件

  3. 03

    提供原始 GitHub 链接、目录导览和本地研究快照,便于复核与二次开发

03 / ENGINEERING

工程与仓库结构

仓库以 JavaScript 为主要实现语言,研究快照包含 23 个文件、8 个主要顶层入口。已提供 README 作为使用与能力说明。 项目最近更新时间为 2026-09-04,许可标记为 MIT License。

01CHANGELOG.md

项目文件与实现资料

02LICENSE

项目文件与实现资料

03README.md

项目文件与实现资料

04docs

设计文档、研究记录或项目配图

05go.mod

项目文件与实现资料

06tc6_xml_v10_b.go

项目文件与实现资料

04 / USE CASES

适合用在哪里

  • 学习项目设计与实现
  • 评估后用于二次开发
  • 作为相关领域的研究参考

05 / QUICK START

从仓库开始

以下命令摘自项目 README 或根据仓库地址生成。请先阅读源仓库的安装要求、许可和脚本,再在自己的环境中运行。

git clone https://github.com/suifei/plcopen-go.git
cd plcopen-go

06 / REPOSITORY MAP

目录证据导览

这里列出快照中的前 23 个索引文件中的代表路径,帮助你快速定位源码、文档、测试与资源。

  • .gitignore
  • CHANGELOG.md
  • LICENSE
  • README.md
  • docs/TC6_XML_V10.xsd
  • docs/TC6_XML_V101.pdf
  • docs/TC6_XML_V10_B.xsd
  • go.mod
  • tc6_xml_v10_b.go
  • tests/body_types_test.go
  • tests/data_types_test.go
  • tests/formatted_text_test.go
  • tests/interface_values_test.go
  • tests/json_serialization_test.go
  • tests/tc6_xml_v10_b_test.go
  • tests/type_coverage_test.go
  • tests/xml_validator_test.go
  • tests/xsd-gen/TC6_XML_V10_B.cs
  • tests/xsd-gen/TC6_XML_V10_B.js
  • tests/xsd-gen/TC6_XML_V10_B.vb
  • utils/file_utils.go
  • utils/marshal.go
  • utils/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

贡献

欢迎贡献代码!请遵循以下步骤:

  1. Fork 本项目
  2. 创建功能分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 创建 Pull Request

许可证

本项目采用 MIT 许可证 - 详见 LICENSE 文件。

相关资源

版本历史

查看项目的详细更新历史和版本说明,请参考:CHANGELOG.md

致谢

感谢 PLCopen 组织提供的 XML 交换格式标准,使得工业自动化项目之间的互操作性成为可能。


如果您觉得这个项目有用,请给它一个 ⭐!