在使用ADS进行数据交互的时候,若出现新增变量则需要同时修改底层PLC与上位机控制程序,那样会相对麻烦,为了开发方便,我们可以选用Json格式来进行数据交互。
JSON的优势
- JSON是纯文本。
- JSON具有良好的自我描述性,便于阅读。
- JSON具有层级结构(值中存在值)。
- JSON数据可使用AJAX(异步JavaScript和XML)进行传输。
在实际应用中,经常使用ajax配合json来完成任务,比和XML配合容易的多,速度快,如果使用XML,需要读取XML文档,然后用XML DOM来遍历文档并读取值并存储在变量中。使用JSON,则只需读取JSON字符串。
JSON库下载
官网:http://json.codeplex.com/
源码地址:https://github.com/JamesNK/Newtonsoft.Json
Newtonsoft.Json.dll下载:https://github.com/JamesNK/Newtonsoft.Json/releases
找到适合自己的.net环境在项目中引用即可
需要注意的是在使用过程中 传递的JSON 数据的 Key 值的名称采用的是 Pascal 还是Camel命名法
UT
public class ADSVariable : INotifyPropertyChanged
{
//使用了INotifyPropertyChanges interface接口
//当值发生改变时,触发
#region 字段
private int handle; //句柄
private string adsVarName; //变量名
private string name;
private string typeName;
private Type type; //数据类型
private string varValue; //值
private string description;
#endregion
#region 事件
public event PropertyChangedEventHandler PropertyChanged;
#endregion
#region 属性
public int Handle
{
get{return handle;}
set{handle = value;}
}
*********************************
AdsVarName
Name
TypeName
Type
Description
*********************************
public string TypeName
{
get{ return typeName;}
set{
try{
typeName = value;
this.type = Type.GetType(typeName, false, true);
}catch(Exception ex){
throw ex;
}
}
}
public string VarValue
{
get{return varValue; }
set{
varValue = value;
NotifyPropertyChanged();
}
}
#endregion
#region 构造函数
/// <summary>
/// <param name="handle"></param>
/// <param name="adsVarName"></param>
/// <param name="name"></param>
/// <param name="typeName"></param>
/// <param name="varValue"></param>
/// <param name="description"></param>
public ADSVariable(int handle, string adsVarName, string name, string typeName, string varValue,string description)
{
this.Handle = handle;
this.AdsVarName = adsVarName;
this.Name = name;
this.TypeName = typeName;
this.VarValue = varValue;
this.Description = description;
}
#endregion
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
ADS的常用接口
interface IADSAccessable
{
/// <summary>
/// 注册变量对象列表
/// </summary>
List<ADSVariable> LstADSVariable { get; set; }
/// <summary>
/// 通过配置文件导入注册变量对象列表
/// </summary>
/// <param name="filepath"></param>
void RegeditADSVeriableByfile(string filepath);
/// <summary>
/// 清空LstADSVariable
/// </summary>
void ResetADSVeriable();
/// <summary>
/// 链接控制器
/// </summary>
/// <param name="netID"></param>
/// <param name="srvPort"></param>
void Connect(string netID, int srvPort);
/// <summary>
/// 通过同步方式读取注册在ADSHelper中的所有变量值,更新至字段LstADSVariable中
/// </summary>
void ReadAllADSVariables();
/// <summary>
/// 通过变量名称字符串从ADS设备中以同步方式读取变量值,存入object类型对象中。
/// </summary>
/// <param name="varName">变量名称</param>
/// <returns>ADSVariable对象</returns>
ADSVariable ReadAnyByVarName(string varName);
/// <summary>
/// 通过变量名写入变量值
/// </summary>
/// <typeparam name="T">变量类型</typeparam>
/// <param name="name">变量名称</param>
/// <param name="value">设定值</param>
void WriteAnyByVarName<T>(string name, T value);
//void WriteAnyByVarName(string name, string value);
/// <summary>
/// 断开与ADS设备的通讯连接
/// </summary>
void Disconnect();
}
ADS的相关接口实现
暂留 哈哈 一会儿再上传
UT测试相关也一会儿再上传
ending!