package plc import ( "context" "errors" "sync" ) // mockClient 模拟西门子 PLC:下发成功即认为写入寄存器,完成信号由外部置位。 type mockClient struct { ack bool sent string mu sync.RWMutex // dockPallet 模拟接驳台是否有托盘:默认全部无托盘;联调时可用 SetDockPallet 置位 dockPallet map[string]bool } func newMockClient() *mockClient { return &mockClient{dockPallet: map[string]bool{}} } // SetDockPallet 手动设置某接驳台是否有托盘(供联调/测试用) func (m *mockClient) SetDockPallet(dockCode string, has bool) { m.mu.Lock() defer m.mu.Unlock() m.dockPallet[dockCode] = has } func (m *mockClient) SendProcessCode(_ context.Context, combination string) ([]int, error) { codes := parseCombination(combination) m.sent = combination m.ack = false return codes, nil } func (m *mockClient) QueryDone(_ context.Context) (bool, error) { if m.sent == "" { return false, errors.New("no process sent") } // 模拟:假设 PLC 已完成,30 秒后返回完成信号 return m.ack, nil } func (m *mockClient) AckDone(_ context.Context, ok bool) { m.ack = ok } func (m *mockClient) QueryDockPallet(_ context.Context, dockCode string) (bool, error) { m.mu.RLock() defer m.mu.RUnlock() return m.dockPallet[dockCode], nil }