自动化采集工具-前言
在工业自动化项目中,上位软件需要跟PLC进行通信对接。一般的做法是定义好信号量,根据信号的变化执行对应的不同流程,比如当信号为1时执行,物料校验,信号为2时进行数据收集等等,因此PLC需要在相应的数据库定义好不同工位不同流程的DB块,块中包含各数据地址。传统的做法时需要对应不同工位定制需要读取的地址以及变量,写好不同的交互逻辑,通信与业务耦合在一起,当通信或者地址发生变化时,需要改动项目代码,有时会比较麻烦而且有改错或者改动到业务代码的风险。因此才有把采集通信数据块的业务,以及流程交互信号的业务抽离出来,最终向服务抛送数据,服务接口只需要关注数据业务的处理,不需要关系数据是如何获取的,标准可配置化的采集工具概念就诞生了,在应对中小场景的数据通信采集工作可以有很好的灵活性。
工具主要功能要求
- 交互信号可配置
- 数据DB地址可配置
- 调用数据服务回调可配置
- 日志报警可视化
- 构建读写DB RestAPI
一、交互信号可配置
其实工位上交互的流程都大同小异,都是依据变量的变化触发不同的操作,这部分代码如果每个项目每个工位单独实现 会是不少的工作量,因此工具可以实现配置化,既提高了防止出差的风险,又减少了工作量,而且灵活性也高 不会因为信号变化而影响到需要变更代码。
二、数据DB地址可配置
对于数据变量的增减可以进行配置,而不用在代码中频繁指定读取地址,提供可视化以及可维护性。
三、调用数据接口
当流程信号满足业务条件时需进行数据接口服务的调用,将当前工位的数据上传至业务接口进行处理,反馈后可能会有结果回写到PLC设备,完成一个双向业务通信的功能。
四、日志报警可视化
执行过程异常日志可视化,流程超时可视化,用于排错以及监控。
五、构建读写的webApi服务
对其他业务程序提供Api,读取变量,更新变量,使得其他业务也能轻松读写设备数据值,而不用关心实际的通信内容,大大提高了拓展性。
public class TagGroup : CommonAttribute
{
/// <summary>
/// 是否是标记组
/// </summary>
public bool IsGroup { set; get; } = false;
/// <summary>
/// 调用MQ
/// </summary>
public bool IsSendToMQ { set; get; }
/// <summary>
/// 交换器
/// </summary>
public string ExchangeName { set; get; }
/// <summary>
/// 是否回调数据
/// </summary>
public bool IsCallBack { set; get; }
/// <summary>
/// 回调数据Url
/// </summary>
public string CallBackApiUrl { set; get; }
/// <summary>
/// 是否回写到PLC
/// </summary>
public bool IsCallBackWrite { set; get; }
/// <summary>
/// 是否开启采集
/// </summary>
public bool IsCollection { set; get; }
/// <summary>
/// 检查写结果
/// </summary>
public bool IsConfirmRewrite { get; set; } = true;
/// <summary>
/// 采集间隔
/// </summary>
public int CollectInterval { set; get; }
/// <summary>
/// 附件Json 数据
/// </summary>
public string AppendJson { set; get; } = "{\\"WorkStationCode\\":\\"\\",\\"StepCode\\":\\"\\",\\"DeviceNumber\\":\\"\\"}";
/// <summary>
/// 回写 plc 标记列表
/// </summary>
public List<Tag> CallBackWriteTags { set; get; } = new List<Tag>();
/// <summary>
/// 标记集合
/// </summary>
public List<Tag> Tags { set; get; } = new List<Tag>();
public List<TagGroup> Tag_groups { set; get; } = new List<TagGroup>();
public List<DynamicParamModel> DynamicParams { get; set; }
public List<Step> StepConfigs { get; set; }
public bool IsHeartBeat { get; set; }
}