RobotBean.cs
9.7 KB
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
using URSoldering.Common;
using URSoldering.LoadCSVLibrary;
using log4net;
using System.Timers;
namespace URSoldering.DeviceLibrary
{
public class RobotBean
{
/// <summary>
/// 报警或者警告信息
/// </summary>
public string WarnMsg = "";
public static string RobotName = "";
public static readonly ILog LOGGER = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
public RobotStatus Status = RobotStatus.Wait;
protected System.Timers.Timer mainTimer = new System.Timers.Timer();
public static RobotConfig baseConfig = null;
public bool IsInSuddendown = false;
/// <summary>
/// 不扫码工作
/// </summary>
public bool NoCodeWork = false;
public string NoCodeCode = "NoCode";
/// <summary>
/// 铆压调试不进行铆压
/// 焊接调试不检测送丝报警
/// </summary>
public bool IsDebug = ConfigAppSettings.GetBoolValue(Setting_Init.ISDebug);
/// <summary>
/// 三色灯定时器
/// </summary>
protected System.Timers.Timer ledTimer = new System.Timers.Timer();
public void InitTimer()
{
ledTimer = new System.Timers.Timer();
ledTimer.AutoReset = true;
ledTimer.Enabled = false;
ledTimer.Interval = 1000;
ledTimer.Elapsed += LedTimer_Elapsed;
mainTimer = new System.Timers.Timer();
mainTimer.AutoReset = true;
mainTimer.Enabled = false;
mainTimer.Interval = 200;
mainTimer.Elapsed += mainTimer_Elapsed;
}
/// <summary>
/// 三色灯处理,复位完成后,如果忙碌绿灯亮,等待状态绿灯闪烁
/// </summary>
private void LedTimer_Elapsed(object sender, ElapsedEventArgs e)
{
if (Status.Equals(RobotStatus.Reset))
{
if (KNDIOValue(IO_Type.AutoRunSingle).Equals(IO_VALUE.LOW))
{
KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.HIGH);
}
if (KNDIOValue(IO_Type.WaitSingle).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
}
else
{
KNDIOMove(IO_Type.WaitSingle, IO_VALUE.HIGH);
}
}
else if (Status.Equals(RobotStatus.Busy))
{
//忙碌或转动,绿灯常亮,黄灯灭,红灯亮时绿灯不亮
if (KNDIOValue(IO_Type.WaitSingle).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
}
if (KNDIOValue(IO_Type.AutoRunSingle).Equals(IO_VALUE.LOW))
{
KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.HIGH);
}
}
else if (Status.Equals(RobotStatus.Runing))
{
//等待状态,黄灯灭,绿灯闪烁,红灯亮时绿灯不亮
if (KNDIOValue(IO_Type.WaitSingle).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
}
if (KNDIOValue(IO_Type.AutoRunSingle).Equals(IO_VALUE.HIGH))
{
KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.LOW);
}
else
{
KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.HIGH);
}
}
}
protected virtual void mainTimer_Elapsed(object sender, ElapsedEventArgs e)
{
}
public static ConfigIO getWaitIO(string type)
{
if (baseConfig.RobotDIList.ContainsKey(type))
{
return baseConfig.RobotDIList[type];
}
else if (baseConfig.RobotDIList.ContainsKey(type))
{
return baseConfig.RobotDIList[type];
}
return null;
}
#region KNDIO
public static void ConnectionIO()
{
foreach (string deviceName in baseConfig.DIODeviceNameList)
{
if (!KNDManager.IsConnection(deviceName))
{
KNDManager.ConnectionIP(deviceName);
System.Threading.Thread.Sleep(100);
}
}
FixtureClamp();
}
public static void FixtureClamp()
{
//连接上IO模块后,夹具夹紧
KNDIOMove(IO_Type.Fixture_Clamp, IO_VALUE.HIGH);
KNDIOMove(IO_Type.Fixture_Relax, IO_VALUE.LOW);
}
public static bool IsFixtureClamp()
{
if (ConfigAppSettings.GetBoolValue(Setting_Init.ISDebug))
{
return true;
}
if (KNDIOValue(IO_Type.Fixture_Clamp).Equals(IO_VALUE.HIGH) && KNDIOValue(IO_Type.Fixture_Relax).Equals(IO_VALUE.LOW))
{
return true;
}
else
{
LogUtil.error("夹具夹紧信号不到位");
return false;
}
}
public static bool ShuddenOK()
{
if (ConfigAppSettings.GetBoolValue(Setting_Init.ISDebug))
{
return true;
}
if (!baseConfig.RobotDIList.ContainsKey(IO_Type.SuddenStop_Single))
{
return false;
}
ConfigIO configIo = baseConfig.RobotDIList[IO_Type.SuddenStop_Single];
if (KNDManager.IsConnection(configIo.DeviceName))
{
IO_VALUE value = KNDIOValue(IO_Type.SuddenStop_Single);
if (value.Equals(IO_VALUE.HIGH))
{
return true;
}
}
return false;
}
public static void KNDIOMove(string ioType, IO_VALUE ioValue)
{
if (baseConfig.RobotDOList.ContainsKey(ioType))
{
ConfigIO configIo = baseConfig.RobotDOList[ioType];
KNDManager.WriteSingleDO(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
System.Threading.Thread.Sleep(60);
}
else
{
LogUtil.error(LOGGER, "没有DO=" + ioType);
}
}
public static void KNDIOMove(string ioType, IO_VALUE ioValue,int millSenconds)
{
if (baseConfig.RobotDOList.ContainsKey(ioType))
{
ConfigIO configIo = baseConfig.RobotDOList[ioType];
KNDManager.WriteSingleDO(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr(), ioValue, millSenconds);
}
else
{
LogUtil.error(LOGGER, "没有DO=" + ioType);
}
}
/// <summary>
/// 阻塞等待IO信号,等到返回true,未等到返回false
/// </summary>
/// <param name="name">IO名称,抛出异常时的消息名</param>
/// <param name="ioType">IO</param>
/// <param name="ioValue">IO值</param>
/// <param name="timeOut">超时时间(毫秒)</param>
public static bool WaitIo(string ioType, IO_VALUE value, int timeOut)
{
return WaitUtil.Wait(timeOut,delegate() {
return value.Equals(RobotBean.KNDIOValue(ioType));
});
}
/// <summary>
/// 阻塞等待IO信号,等到返回,超时抛出TimeoutException
/// </summary>
/// <param name="name">IO名称,抛出异常时的消息名</param>
/// <param name="ioType">IO</param>
/// <param name="ioValue">IO值</param>
/// <param name="timeOut">超时时间(毫秒)</param>
public static void WaitIo(string name, string ioType, IO_VALUE value, int timeOut)
{
WaitUtil.Wait(name, timeOut, delegate () {
return value.Equals(RobotBean.KNDIOValue(ioType));
});
}
public static IO_VALUE KNDIOValue(string ioType)
{
IO_VALUE ioValue = IO_VALUE.LOW;
if (baseConfig.RobotDIList.ContainsKey(ioType))
{
ConfigIO configIo = baseConfig.RobotDIList[ioType];
ioValue = KNDManager.GetDIValue(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr());
//UpdateDoValue(ioType, ioValue);
}
else if (baseConfig.RobotDOList.ContainsKey(ioType))
{
ConfigIO configIo = baseConfig.RobotDOList[ioType];
ioValue = KNDManager.GetDOValue(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr());
}
else
{
LogUtil.error(LOGGER, "没有DO=" + ioType);
}
return ioValue;
}
public void CloseLed( )
{
KNDIOMove(IO_Type.AutoRunSingle, IO_VALUE.LOW);
KNDIOMove(IO_Type.AlarmSingle, IO_VALUE.LOW);
KNDIOMove(IO_Type.WaitSingle, IO_VALUE.LOW);
}
#endregion
}
/// <summary>
/// 机器人当前的状态
/// </summary>
public enum RobotStatus
{
/// <summary>
/// 等待状态
/// </summary>
Wait=0,
/// <summary>
/// 机器复位中
/// </summary>
Reset=1,
/// <summary>
/// 正常运行中
/// </summary>
Runing=2,
/// <summary>
/// 忙碌中,如正在焊接或正在检测
/// </summary>
Busy=3,
/// <summary>
/// 流水线转动中
/// </summary>
LineMove=4
}
}