Skip to content

A comprehensive Go library for handling IEC 61131-3 PLCopen XML format with complete structure definitions generated from XSD schema. Supports both XML and JSON serialization for industrial automation projects.

License

Notifications You must be signed in to change notification settings

suifei/plcopen-go

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

PLCopen-Go

一个用于处理 IEC 61131-3 PLCopen XML 格式的 Go 库,支持从 XSD 模式生成的完整结构体定义。

Go Version License Go Report Card Changelog

功能特性

  • 🔧 完整的 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 元素

项目结构

编程语言支持

  • 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 目录中的各种示例:

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 交换格式标准,使得工业自动化项目之间的互操作性成为可能。


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

About

A comprehensive Go library for handling IEC 61131-3 PLCopen XML format with complete structure definitions generated from XSD schema. Supports both XML and JSON serialization for industrial automation projects.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published