ProcedureModel.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. using Cognex.VisionPro.ToolBlock;
  2. using Newtonsoft.Json;
  3. using Prism.Mvvm;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Collections.ObjectModel;
  7. using System.Drawing;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using TeamAAS_VP.Enums;
  12. using TeamAAS_VP.Models.Feeder;
  13. using TeamAAS_VP.Models.Lights;
  14. using TeamAAS_VP.Models.Product;
  15. namespace TeamAAS_VP.Models
  16. {
  17. /// <summary>
  18. /// 流程模型
  19. /// </summary>
  20. [JsonObject(MemberSerialization.OptOut)]
  21. public class ProcedureModel : BindableBase
  22. {
  23. public Guid Id { get; set; }
  24. /// <summary>
  25. /// 流程名称
  26. /// </summary>
  27. public string Name { get; set; }
  28. public string CameraName { get; set; }
  29. /// <summary>
  30. /// 视觉图像处理模式
  31. /// </summary>
  32. public VisionModel VisionModel { get; set; }
  33. /// <summary>
  34. /// 触发相机命令
  35. /// </summary>
  36. public string TriggerCommand { get; set; }
  37. /// <summary>
  38. /// 机器人
  39. /// </summary>
  40. public Guid RobotId { get; set; }
  41. /// <summary>
  42. /// Feeder
  43. /// </summary>
  44. public Guid FeederId { get; set; }
  45. /// <summary>
  46. /// Camera
  47. /// </summary>
  48. public Guid CameraId { get; set; }
  49. /// <summary>
  50. /// 校准
  51. /// </summary>
  52. public Guid CalibrationId { get; set; }
  53. private ObservableCollection<ProcedureOutput> _ProcedureOutputs;
  54. /// <summary>
  55. /// 视觉流程输出集合
  56. /// </summary>
  57. public ObservableCollection<ProcedureOutput> ProcedureOutputs
  58. {
  59. get { return _ProcedureOutputs; }
  60. set { SetProperty(ref _ProcedureOutputs,value); }
  61. }
  62. private string _OutputSeparator = ";";
  63. /// <summary>
  64. /// 视觉流程输出项之间的分割符
  65. /// </summary>
  66. public string OutputSeparator
  67. {
  68. get { return _OutputSeparator; }
  69. set { SetProperty(ref _OutputSeparator, value); }
  70. }
  71. private FeederWorks _FeederWorks;
  72. /// <summary>
  73. /// Feeder振动集合
  74. /// </summary>
  75. public FeederWorks FeederWorks
  76. {
  77. get { return _FeederWorks; }
  78. set { SetProperty(ref _FeederWorks,value); }
  79. }
  80. private FeederStockWorks _FeederStockWorks;
  81. /// <summary>
  82. /// Feeder料仓振动集合
  83. /// </summary>
  84. public FeederStockWorks FeederStockWorks
  85. {
  86. get { return _FeederStockWorks; }
  87. set { SetProperty(ref _FeederStockWorks, value); }
  88. }
  89. private double _MinArea;
  90. /// <summary>
  91. /// Blob最小面积
  92. /// </summary>
  93. public double MinArea
  94. {
  95. get { return _MinArea; }
  96. set { SetProperty(ref _MinArea, value); }
  97. }
  98. private int _LightValue;
  99. /// <summary>
  100. /// 亮度
  101. /// </summary>
  102. public int LightValue
  103. {
  104. get { return _LightValue; }
  105. set { SetProperty(ref _LightValue, value); }
  106. }
  107. private float _ExposureTime;
  108. /// <summary>
  109. /// 相机曝光时间
  110. /// </summary>
  111. public float ExposureTime
  112. {
  113. get { return _ExposureTime; }
  114. set { SetProperty(ref _ExposureTime, value);}
  115. }
  116. private float _Gain;
  117. /// <summary>
  118. /// 相机增益
  119. /// </summary>
  120. public float Gain
  121. {
  122. get { return _Gain; }
  123. set { SetProperty(ref _Gain, value); }
  124. }
  125. private CogToolBlock _ToolBlock;
  126. /// <summary>
  127. /// 工具组
  128. /// </summary>
  129. [JsonIgnore]
  130. public CogToolBlock ToolBlock
  131. {
  132. get { return _ToolBlock; }
  133. set { SetProperty(ref _ToolBlock,value); }
  134. }
  135. private ObservableCollection<ToolInfo> _ToolInfo = new ObservableCollection<ToolInfo>();
  136. /// <summary>
  137. /// 工具末端的补偿
  138. /// </summary>
  139. public ObservableCollection<ToolInfo> ToolInfo
  140. {
  141. get { return _ToolInfo; }
  142. set { SetProperty(ref _ToolInfo, value); }
  143. }
  144. private int _WaitPhoto;
  145. /// <summary>
  146. /// 延时拍照时长(ms)
  147. /// </summary>
  148. public int WaitPhoto
  149. {
  150. get { return _WaitPhoto; }
  151. set { SetProperty(ref _WaitPhoto, value); }
  152. }
  153. private int _WaitFeederStop;
  154. /// <summary>
  155. /// 等待震动盘静止时长(ms)
  156. /// </summary>
  157. public int WaitFeederStop
  158. {
  159. get { return _WaitFeederStop; }
  160. set { SetProperty(ref _WaitFeederStop, value); }
  161. }
  162. private VibrationModel _VibrationModel;
  163. /// <summary>
  164. /// 振动模式
  165. /// </summary>
  166. public VibrationModel VibrationModel
  167. {
  168. get { return _VibrationModel; }
  169. set { SetProperty(ref _VibrationModel, value); }
  170. }
  171. private int _FeederFailLimit;
  172. /// <summary>
  173. /// 拍照失败Feeder振动最大次数
  174. /// </summary>
  175. public int FeederFailLimit
  176. {
  177. get { return _FeederFailLimit; }
  178. set { SetProperty(ref _FeederFailLimit, value); }
  179. }
  180. private OutputPointMode _OutputPointMode;
  181. /// <summary>
  182. /// 点位发送的模式
  183. /// </summary>
  184. public OutputPointMode OutputPointMode
  185. {
  186. get { return _OutputPointMode; }
  187. set { SetProperty(ref _OutputPointMode, value); }
  188. }
  189. private int _OutputPointCountMax=100;
  190. /// <summary>
  191. /// 每次发送给机器人的点数最大值
  192. /// </summary>
  193. public int OutputPointCountMax
  194. {
  195. get { return _OutputPointCountMax; }
  196. set { SetProperty(ref _OutputPointCountMax, value); }
  197. }
  198. private bool _IsExcludeNearPoint;
  199. /// <summary>
  200. /// 是否剔除本次识别到的物料与上一次识别到的物料位置过近的点
  201. /// </summary>
  202. public bool IsExcludeNearPoint
  203. {
  204. get { return _IsExcludeNearPoint; }
  205. set { SetProperty(ref _IsExcludeNearPoint, value); }
  206. }
  207. private double _ExcludeNearPointThreshol=1;
  208. /// <summary>
  209. /// 物料位置过近阈值
  210. /// </summary>
  211. public double ExcludeNearPointThreshol
  212. {
  213. get { return _ExcludeNearPointThreshol; }
  214. set { SetProperty(ref _ExcludeNearPointThreshol, value); }
  215. }
  216. private bool _IsSaveImage;
  217. /// <summary>
  218. /// 保存图像
  219. /// </summary>
  220. public bool IsSaveImage
  221. {
  222. get { return _IsSaveImage; }
  223. set { SetProperty(ref _IsSaveImage, value); }
  224. }
  225. private ProcedureSaveImageModel _SaveImageModel;
  226. /// <summary>
  227. /// 存图模式
  228. /// </summary>
  229. public ProcedureSaveImageModel SaveImageModel
  230. {
  231. get { return _SaveImageModel; }
  232. set { SetProperty(ref _SaveImageModel, value); }
  233. }
  234. private ProcedureSaveImagePathModel _SaveImagePathModel;
  235. /// <summary>
  236. /// 存图路径模式
  237. /// </summary>
  238. public ProcedureSaveImagePathModel SaveImagePathModel
  239. {
  240. get { return _SaveImagePathModel; }
  241. set { SetProperty(ref _SaveImagePathModel, value); }
  242. }
  243. private string _SavePath;
  244. /// <summary>
  245. /// 存图路径
  246. /// </summary>
  247. public string SavePath
  248. {
  249. get { return _SavePath; }
  250. set { SetProperty(ref _SavePath, value); }
  251. }
  252. private bool _IsCompress;
  253. /// <summary>
  254. /// 是否压缩图片
  255. /// </summary>
  256. public bool IsCompress
  257. {
  258. get { return _IsCompress; }
  259. set { SetProperty(ref _IsCompress, value); }
  260. }
  261. private FeederFrequencyModel _FeederFindFrequency;
  262. /// <summary>
  263. /// Feeder自动寻频配置
  264. /// </summary>
  265. public FeederFrequencyModel FeederFindFrequency
  266. {
  267. get { return _FeederFindFrequency; }
  268. set { SetProperty(ref _FeederFindFrequency, value); }
  269. }
  270. private ObservableCollection<ProcedureUserDefineParam> _UserDefineParameters;
  271. /// <summary>
  272. /// 用户自定义参数
  273. /// </summary>
  274. public ObservableCollection<ProcedureUserDefineParam> UserDefineParameters
  275. {
  276. get { return _UserDefineParameters; }
  277. set { SetProperty(ref _UserDefineParameters, value); }
  278. }
  279. private ObservableCollection<ChannelConfig> _LightChannels;
  280. /// <summary>
  281. /// 光源通道配置集合。每个流程可配置多个光源通道及其默认亮度。
  282. /// </summary>
  283. public ObservableCollection<ChannelConfig> LightChannels
  284. {
  285. get { return _LightChannels; }
  286. set { SetProperty(ref _LightChannels, value); }
  287. }
  288. #region 运行时的一些临时记忆
  289. /// <summary>
  290. /// 最后一次的Blob面积值
  291. /// </summary>
  292. [JsonIgnore]
  293. public double LastBlobArea { get; set; } = 0;
  294. /// <summary>
  295. /// 最后一次运行的点数据
  296. /// </summary>
  297. [JsonIgnore]
  298. public List<double[]> LastRunPoints { get; set; } = new List<double[]>();
  299. #endregion
  300. public ProcedureModel()
  301. {
  302. Id = Guid.NewGuid();
  303. ProcedureOutputs = new ObservableCollection<ProcedureOutput>();
  304. ToolInfo= new ObservableCollection<ToolInfo>();
  305. FeederFindFrequency= new FeederFrequencyModel();
  306. UserDefineParameters= new ObservableCollection<ProcedureUserDefineParam>();
  307. FeederWorks = new FeederWorks();
  308. FeederStockWorks= new FeederStockWorks();
  309. LightChannels = new ObservableCollection<ChannelConfig>();
  310. }
  311. public ProcedureModel(string name, string cameraName, Guid cameraId)
  312. {
  313. Id = Guid.NewGuid();
  314. Name = name;
  315. CameraName = cameraName;
  316. CameraId = cameraId;
  317. ProcedureOutputs = new ObservableCollection<ProcedureOutput>();
  318. ToolInfo = new ObservableCollection<ToolInfo>();
  319. FeederFindFrequency = new FeederFrequencyModel();
  320. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>();
  321. FeederWorks = new FeederWorks();
  322. FeederStockWorks = new FeederStockWorks();
  323. LightChannels = new ObservableCollection<ChannelConfig>();
  324. }
  325. public ProcedureModel Clone()
  326. {
  327. return new ProcedureModel
  328. {
  329. Id = this.Id,
  330. Name = this.Name,
  331. CameraName=this.CameraName,
  332. VisionModel = this.VisionModel,
  333. TriggerCommand=this.TriggerCommand,
  334. RobotId = this.RobotId,
  335. FeederId = this.FeederId,
  336. CameraId = this.CameraId,
  337. CalibrationId = this.CalibrationId,
  338. ProcedureOutputs = new ObservableCollection<ProcedureOutput>(this.ProcedureOutputs.Select(po => po.Copy())),
  339. FeederWorks = this.FeederWorks?.Copy(),
  340. FeederStockWorks = this.FeederStockWorks?.Copy(),
  341. MinArea = this.MinArea,
  342. LightValue = this.LightValue,
  343. ExposureTime = this.ExposureTime,
  344. Gain = this.Gain,
  345. // ToolBlock不克隆
  346. ToolInfo = new ObservableCollection<ToolInfo>(this.ToolInfo.Select(ti => ti.Copy())),
  347. WaitPhoto = this.WaitPhoto,
  348. WaitFeederStop = this.WaitFeederStop,
  349. VibrationModel = this.VibrationModel,
  350. FeederFailLimit = this.FeederFailLimit,
  351. OutputPointCountMax = this.OutputPointCountMax,
  352. IsSaveImage = this.IsSaveImage,
  353. SaveImageModel = this.SaveImageModel,
  354. SaveImagePathModel = this.SaveImagePathModel,
  355. SavePath = this.SavePath,
  356. IsCompress = this.IsCompress,
  357. FeederFindFrequency = this.FeederFindFrequency?.Copy(),
  358. IsExcludeNearPoint=this.IsExcludeNearPoint,
  359. ExcludeNearPointThreshol = this.ExcludeNearPointThreshol,
  360. OutputPointMode=this.OutputPointMode,
  361. OutputSeparator=this.OutputSeparator,
  362. UserDefineParameters = new ObservableCollection<ProcedureUserDefineParam>(this.UserDefineParameters.Select(udp => udp.Copy())),
  363. LightChannels = this.LightChannels == null ? new ObservableCollection<ChannelConfig>() : new ObservableCollection<ChannelConfig>(this.LightChannels.Select(ch => new ChannelConfig
  364. {
  365. Name = ch.Name,
  366. Description = ch.Description,
  367. LocalIndex = ch.LocalIndex,
  368. GlobalIndex = ch.GlobalIndex,
  369. DefaultBrightness = ch.DefaultBrightness
  370. })),
  371. };
  372. }
  373. }
  374. }