kazelee
2025-06-05 f248d4a25fb196149c9add083e74252d7334b37d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
using System;
 
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
 
namespace HH.WCS.Mobox3.DSZSH.device {
    /// <summary>
    /// 输送线PLC设备
    /// </summary>
    public class ProductionLineDevice {
 
        public string Ip { get; set; }
        public int Port { get; set; }
 
        public ProductionLineDevice(string ip, int port) {
            Ip = ip;
            Port = port;
        }
 
        public ProductionLineDevice(string id, string ip, int port) {
            Ip = ip;
            Port = port;
            Id = id;
        }
        
        public ProductionLineDevice(Config.ProductionLine line) {
            Ip = line.PlcIp;
            Port = line.PlcPort;
            Id = line.Id;
        }
 
        public string Id { get; set; }
 
        /// <summary>
        /// 系统状态:0本地 1联动(AGV模式) 2故障
        /// </summary>
        public int SystemState { get; set; }
 
        /// <summary>
        /// 满垛下线:1输送线末端有成品料,需要AGV搬运 0默认值
        /// </summary>
        public int FullOffline { get; set; }
 
        /// <summary>
        /// 呼叫托盘垛:1需要空托,呼叫AGV配送 0默认值
        /// </summary>
        public int CallPallet { get; set; }
 
        /// <summary>
        /// 允许 AGV 放托盘垛:1允许放垛 0默认值
        /// </summary>
        public int AllowAgvPlacePallet { get; set; }
 
        //private int _agvPicking;
        //private int _agvPlacingPallet;
 
        ///// <summary>
        ///// AGV 正在取货:下线AGV写入1,取货完成后恢复0
        ///// </summary>
        //public int AgvPicking {
        //    get => _agvPicking;
        //    set {
        //        var isOk = ModbusHelper.WriteSingleRegister(10, value, Ip, Port);
        //        _agvPicking = isOk ? value : throw new Exception($"修改 [AGV 正在取货] 为 '{value}' 失败");
        //    }
        //}
 
        /// <summary>
        /// AGV 正在取货:下线AGV写入1,取货完成后恢复0
        /// </summary>
        public int AgvPicking { get; set; }
 
        /// <summary>
        /// AGV 正在取货:下线AGV写入1,取货完成后恢复0
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool SetAgvPicking(int value) {
            if (!ModbusHelper.WriteSingleRegister(10, value, Ip, Port)) {
                return false;
            }
 
            AgvPicking = value;
            return true;
        }
 
        ///// <summary>
        ///// AGV 正在放托盘垛:上线AGV写入1,放托完成后恢复0
        ///// </summary>
        //public int AgvPlacingPallet {
        //    get => _agvPlacingPallet;
        //    set {
        //        var isOk = ModbusHelper.WriteSingleRegister(11, value, Ip, Port);
        //        _agvPlacingPallet = isOk ? value : throw new Exception($"修改 [AGV 正在放托盘垛] 为 '{value}' 失败");
        //    }
        //}
 
        /// <summary>
        /// AGV 正在放托盘垛:上线AGV写入1,放托完成后恢复0
        /// </summary>
        public int AgvPlacingPallet { get; set; }
 
        /// <summary>
        /// AGV 正在放托盘垛:上线AGV写入1,放托完成后恢复0
        /// </summary>
        public bool SetAgvPlacingPallet(int value) {
            if (!ModbusHelper.WriteSingleRegister(11, value, Ip, Port)) {
                return false;
            }
 
            AgvPlacingPallet = value;
            return true;
        }
 
        public bool LoadDeviceStateOk() {
            var readArray = ModbusHelper.ReadHoldingRegisters(0, 20, Ip, Port);
            if (readArray == null || readArray.Length < 12) {
                return false;
            }
 
            // 只读地址数据
            SystemState = readArray[0];
            FullOffline = readArray[1];
            CallPallet = readArray[2];
            AllowAgvPlacePallet = readArray[3];
            // 可写地址数据
            //_agvPicking = readArray[10];
            //_agvPlacingPallet = readArray[11];
            AgvPicking = readArray[10];
            AgvPlacingPallet = readArray[11];
 
            var log = JsonConvert.SerializeObject(readArray);
            LogHelper.Info(log);
            return true;
        }
    }
}