https://github.com/suifei/plcopen-go
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.
https://github.com/suifei/plcopen-go
automation control-systems function-block-diagrams go-library iec-61131-3 industrial-automation json-serialization ladder-diagram manufacturing plc-programming plcopen structured-text xml-parser xml-schema xsd-validation
Last synced: about 2 months ago
JSON representation
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.
- Host: GitHub
- URL: https://github.com/suifei/plcopen-go
- Owner: suifei
- License: mit
- Created: 2025-05-31T06:13:09.000Z (9 months ago)
- Default Branch: main
- Last Pushed: 2025-05-31T07:10:04.000Z (9 months ago)
- Last Synced: 2025-08-02T23:49:46.057Z (7 months ago)
- Topics: automation, control-systems, function-block-diagrams, go-library, iec-61131-3, industrial-automation, json-serialization, ladder-diagram, manufacturing, plc-programming, plcopen, structured-text, xml-parser, xml-schema, xsd-validation
- Language: JavaScript
- Homepage:
- Size: 501 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# PLCopen-Go
一个用于处理 IEC 61131-3 PLCopen XML 格式的 Go 库,支持从 XSD 模式生成的完整结构体定义。
[](https://golang.org/dl/)
[](LICENSE)
[](https://goreportcard.com/report/github.com/suifei/plcopen-go)
[](CHANGELOG.md)
## 功能特性
- 🔧 完整的 PLCopen XML TC6 V1.0B 标准支持
- 📝 从 XSD 模式自动生成的 Go 结构体
- ✅ XML 模式验证支持
- 🛠️ 丰富的工具函数和实用程序
- 📊 全面的测试覆盖率
- 🌐 支持多种编程语言(ST、FBD、LD 等)
- 🔄 支持 XML 和 JSON 双重序列化格式
## 安装
```bash
go get github.com/suifei/plcopen-go
```
## 快速开始
### 创建 PLCopen 项目
```go
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 文件
```go
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 序列化支持
```go
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 等)
- 用户定义的数据类型
- 数组和结构体
- 枚举类型
## 工具函数
### 文件操作
```go
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")
```
## 测试
运行所有测试:
```bash
go test ./...
```
运行特定测试:
```bash
go test ./tests -v
```
运行 XML 验证测试:
```bash
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](https://godoc.org/github.com/suifei/plcopen-go)
## 贡献
欢迎贡献代码!请遵循以下步骤:
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](LICENSE) 文件。
## 相关资源
- [PLCopen 官方网站](https://www.plcopen.org/)
- [IEC 61131-3 标准](https://en.wikipedia.org/wiki/IEC_61131-3)
- [PLCopen XML 规范](https://www.plcopen.org/technical-activities/xml-exchange-format)
## 版本历史
查看项目的详细更新历史和版本说明,请参考:[CHANGELOG.md](CHANGELOG.md)
## 致谢
感谢 PLCopen 组织提供的 XML 交换格式标准,使得工业自动化项目之间的互操作性成为可能。
---
如果您觉得这个项目有用,请给它一个 ⭐!