C#通过自定义控件实现在设计界面关联PLC通讯地址
前言
用Wincc或者触摸屏软件开发上位机时,可以方便的在控件中填写与PLC的关联地址就可以实现PLC变量的读写,在C#WinForm中也可以通过在控件中添加自定义属性来实现这一功能。
效果
实现过程
- 建立自定义控件
- 在控件中添加Address、Rate、TypeMode等属性
public partial class CheckBoxEx : CheckBox
{
public CheckBoxEx()
{
InitializeComponent();
}
[Category("Data")]
public string Address { get; set; }
[Category("Data")]
public int Rate { get; set; }
[Category("Data")]
public string Comment { get; set; }
[Category("Data")]
public TypeMode Mode { get { return TypeMode.Boolen; }set {value = TypeMode.Boolen ; }}
[Category("Data")]
public string Value { get { return this.Checked.ToString(); } set { this.Checked = value == "True"?true:false; } }
public CheckBoxEx(IContainer container)
{
container.Add(this);
InitializeComponent();
}
}
- 解析地址
我使用的是Snap7与西门子通信,西门子DB块的地址通常为DB1.D100.0,为了简化地址输入,通常使用一个DB块与上位机通信,所以地址可简化为100.0(字符串类型),DB块号默认为1 。对于Int和DInt等占一个字节以上的数据,只需要地址偏移量100即可,对于bool量,则还需要.0也就是位,于是地址解析就变成了从一个带小数点的字符串中取出小数点前的数和小数点后的数。
代码如下:
private void WriteMethod(string address, int value)
{
int idx = address.LastIndexOf(".");
string strF = address.Substring(idx + 1);
string strW = address.Substring(0, idx);
int FiledValue = System.Convert.ToInt32(strF);
int Offset = System.Convert.ToInt32(strW);
S7.SetDIntAt(plc.DB_WriteBuffer, Offset, value);
plc.PLC_DB_Write(1, 0, 222);
}
- 建立连接
地址解析完成后就可以根据地址将控件数据写入或读取到缓存Buffer,再将Buffer内数据一次写入到PLC或从PLC读取到内存。具体内容可以搜索Snap7的Api。