初始化

This commit is contained in:
SunYF
2026-08-28 14:07:22 +08:00
parent a185247ab1
commit b34325a16f
971 changed files with 291 additions and 220360 deletions
-11
View File
@@ -1,11 +0,0 @@
package plc
type PlcConf struct {
Host string
ConnectType int `json:",optional"`
// 工序号下发相关(现场信号未定义前先用默认约定,联调对齐后改配置即可)
ProcessAddr string `json:",default=DB100.DBW0"` // 工序号写入地址(DBW0=uint16,如 125 执行1序2序5序)
DoneBitAddr string `json:",default=M100.0"` // 完成位读取地址(收齐后清复位)
SimDoneSeconds int `json:",default=3"` // 模拟模式下经过多少秒自动确认完成
}
-56
View File
@@ -1,56 +0,0 @@
/*
* Copyright (c) 2025 Beijing Hardman Automation Equipment Co., LTD. All rights reserved.
*
* Project: adapter
* File: error.go
* Last: 2025-05-15 11:52:07
* Author: wangcheng@bj-hardman.com
*/
package plc
import (
"encoding/binary"
"errors"
"fmt"
"bj_power_mes/internal/preload"
)
// 预定义错误
var (
ErrNotConnect = errors.New("PLC未连接")
ErrInvalidAddress = errors.New("无效的PLC地址")
)
// GetErrorCode 获取机器人错误代码
func (m *Manager) GetErrorCode() (int64, error) {
addr := preload.GetMAddress("ErrorCode")
bs, err := m.GetPlc().Read(addr.Address(), 8)
if err != nil {
return 0, err
}
return int64(binary.LittleEndian.Uint64(bs)), nil
}
var (
Err_TaskNoError = RobotError(1 << 0) // 任务号错误
Err_RackNoError = RobotError(1 << 1) // 料架号下发错误
Err_RackHasNoWorkpiece = RobotError(1 << 2) // 所取料架号无料
)
var RobotErrorMap = map[RobotError]string{
Err_TaskNoError: "任务号错误",
Err_RackNoError: "料架号下发错误",
Err_RackHasNoWorkpiece: "所取料架号无料",
}
type RobotError int64
func (r RobotError) Error() string {
if s, ok := RobotErrorMap[r]; ok {
return s
}
return fmt.Sprintf("unknown robot error (code: %d)", int64(r))
}
-74
View File
@@ -1,74 +0,0 @@
package plc
import (
"context"
"log/slog"
"time"
goplc "bjhardman.cn/bjhardman/goplc"
"bjhardman.cn/bjhardman/goplc/s7"
"bj_power_mes/internal/eventbus"
)
type Manager struct {
client goplc.Client
bus eventbus.Bus
}
func Build(conf PlcConf, bus eventbus.Bus) *Manager {
m := &Manager{bus: bus}
client := s7.NewClient(conf.Host,
s7.WithMaxRetries(-1),
s7.WithConnectionType(s7.ConnectionType(conf.ConnectType)),
s7.WithOnConnected(func() {
slog.Info("PLC connected", "host", conf.Host)
m.publishConnectionEvent(true)
}),
s7.WithOnDisconnected(func(err error) {
if err != nil {
slog.Error("PLC disconnected with error", "host", conf.Host, "error", err)
} else {
slog.Warn("PLC disconnected", "host", conf.Host)
}
m.publishConnectionEvent(false)
}),
s7.WithOnReconnecting(func(attempt int) {
slog.Info("PLC reconnecting", "host", conf.Host, "attempt", attempt)
}),
)
m.client = client
go func() {
_ = client.Connect()
}()
return m
}
func (m *Manager) publishConnectionEvent(connected bool) {
if m.bus == nil {
return
}
_ = m.bus.Publish(context.Background(), eventbus.Event{
ID: "conn-" + time.Now().Format("20060102150405.000"),
Type: eventbus.EventConnectionStatusUpdated,
Source: "plc-manager",
Timestamp: time.Now(),
Payload: map[string]any{
"plcConnected": connected,
},
})
}
// NewManager creates a Manager with a pre-built PLC client.
func NewManager(client goplc.Client) *Manager {
return &Manager{client: client}
}
func (m *Manager) GetPlc() (rc goplc.Client) {
return m.client
}
func (m *Manager) IsConnected() bool {
return m.client != nil && m.client.IsConnected()
}