c#实现上位机数据采集的项目总结

c#实现上位机数据采集的项⽬总结
功能要求
1. 采集来⾃PLC的⽣产数据和报警信息
2. 采集来⾃测试仪的测试数据
视音频切换器3. 可以分机种保存⼀些参数
4. 将采集的数据写⼊Excel,供MES系统查询和现场查看
项⽬实现
1、采集PLC数据
硬件采⽤RS232串⼝,通讯协议使⽤ModusbusRTU。以前跟PLC通讯,为求简单,⼀般直接使⽤⽆协议,使⽤倒没问题,但偶尔出现数据丢失也是烦⼈,要确保对⽅接收到数据还要双⽅写返回数据。使⽤modbus协议,PLC基本不⽤写通讯程序,⽽上位机可以直接⾃⼰确认对⽅是否收到数据,再确认是否给对⽅重发⼀次。这个项⽬只要求采集数据,因为读取的频率⾼于数据变化,所以偶尔读不到都不影响,使⽤modbus就更合适了。
/// <summary>
/// 通过Modbus读取PLC,获取相应数据
/// </summary>
private void ScanPLC()
{
//创建字节数组
byte[] result = null;
//从站号
ushort DevAdd = 1;
//起始地址
ushort Address = 100;
/
/长度
ushort Length = 5;
while (running)
{
if (plcConnected)
{
result = objModbus.ReadKeepReg(DevAdd, Address, Length);
DataProcessing(result, Length);
}
else
{
try
{
objModbus.OpenMyCom(9600, comName1, 8, Parity.Odd, StopBits.One);
//objModbus.ReadTimeOut = 500;
plcConnected = true;
textReceive.Invoke(new ExecuteWork(RecRunData), "重连PLC成功");
}
catch (Exception ex)
{
textReceive.Invoke(new ExecuteWork(RecRunData), "重连PLC失败:" + ex.Message);
plcConnected = false;
}
}
Thread.Sleep(1000);
}
}
2、采集测试仪数据
硬件也是采⽤RS232串⼝,因为测试仪的说明书不完善,modbus协议没有测试成功,⽽⽆协议测试成功了,所以直接采⽤⽆协议接收数据。采取的采集数据模式是,测试仪有测试数据马上主动通过串⼝发送,⽽我的程序只要⼀直处于接收状态,有数据就记下。所以建了⼀个线程⼀直扫描串⼝数据。
关于串⼝⽆协议通讯,以前也有个烦恼。就是接收数据有时会把⼀条数据拆成两条或者两条数据合成⼀条接收,要进⾏⼀些处理判断很是⿇烦。这次发现Serial⾃带的读取功能很全⾯(可以在Serialport这个类下到)。于是我直接采⽤了下⾯这个函数,再也不⽤担⼼⽼是读错数据了~
//
// 摘要:
//    ⼀直读取到输⼊缓冲区中的指定 value 的字符串。
//
// 参数:
//  value:
//    指⽰读取操作停⽌位置的值。
//
// 返回结果:
//    输⼊缓冲区中直到指定 value 的内容。柔毛水杨梅
//
// 异常:
/
/  T:System.ArgumentException:
//    长度 value 参数为 0。
//
//  T:System.ArgumentNullException:
//    value 参数为 null。
//
//  T:System.InvalidOperationException:
//    指定的端⼝未打开。
//
//  T:System.TimeoutException:
//    该操作未完成之前超时期限已结束。
public string ReadTo(string value);
3、分机种保存参数
这个之前有⽤过读写TXT⽂本,有读写过配置⽂件,也⽤过⾃带的应⽤程序设置。这次使⽤的是当前机种存在应⽤程序设置中,具体机种数据则存在ini⽂件中。应⽤程序设置只要配置⼀下读取和保存,很简单。ini⽂件的读写⿇烦些,将机种名设为Section,将具体的参数作为key的值。
/// 读取机种参数
/// </summary>
public void ReadFiles()文丘里混合器
{
try
{
IniHelper iniHelp = new IniHelper(@".\config.ini", JiZhong);
GongDan        = iniHelp.ReadIniData(JiZhong, "GongDan"        );
LiHao          = iniHelp.ReadIniData(JiZhong, "LiHao"          );
LiHaoZhouQi    = iniHelp.ReadIniData(JiZhong,"LiHaoZhouQi");
DianRongGuiGe  = iniHelp.ReadIniData(JiZhong,"DianRongGuiGe");
WeiZhi          = iniHelp.ReadIniData(JiZhong,"WeiZhi");
PiLiang        = iniHelp.ReadIniData(JiZhong,"PiLiang");
YiChangCiShu    = iniHelp.ReadIniData(JiZhong,"YiChangCiShu");
ChanLiang      = iniHelp.ReadIniData(JiZhong, "ChanLiang");
JiZhongs        = iniHelp.ReadIniData("JiZhongMing", "JiZhongs");
}
catch (Exception)
{
MessageBox.Show("未到配置⽂件,将使⽤默认配置");
}
}
/// <summary>
/// 写⼊机种参数
/// </summary>
public void SaveFiles()
{
string path = @".\config.ini";
if(!File.Exists(path))
{
FileStream fs = new FileStream(path, FileMode.CreateNew);
fs.Close();
}
IniHelper iniHelp = new IniHelper(path, JiZhong);
iniHelp.WriteIniData("GongDan"      , GongDan);
iniHelp.WriteIniData( "LiHao"        , LiHao        );机器人定位
iniHelp.WriteIniData("LiHaoZhouQi", LiHaoZhouQi  );
iniHelp.WriteIniData("DianRongGuiGe", DianRongGuiGe);
iniHelp.WriteIniData("WeiZhi", WeiZhi      );
iniHelp.WriteIniData("PiLiang", PiLiang      );
iniHelp.WriteIniData("YiChangCiShu", YiChangCiShu );
iniHelp.WriteIniData( "ChanLiang"    , ChanLiang    );
IniHelper iniHelp1 = new IniHelper(path, "JiZhongMing");
iniHelp1.WriteIniData( "JiZhongs", JiZhongs      );
}
4、将数据写⼊Excel
这涉及到Excel的读写,之前了解过,但没使⽤过。⽹上到了好⼏种⽅案,有使⽤Office⾃带库的,有使⽤各种开源软件的。测试了⼏种开源⼯具,都不得其法,后来看⽤NPOI的很多,⽽且不需要安装Office,功能也很强⼤,遂决定采⽤。通过参考案例,发现还是⽐较容易使⽤的。
/// 向Excel中插⼊⾏
/// </summary>
/// <param name="n">在第⼏⾏插⼊</param>
/// <param name="filePath">⽂件路径</param>
/// <param name="RecordData">插⼊的数据<⼀维数组></param>
public void InsertRow(int n = 1, string filePath = "D:\\RunData\\test.xlsx", string[] RecordData =null)
{
string fileExt = Path.GetExtension(filePath).ToLower();//获取扩展名
IWorkbook workbook;
using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
大功率led光源{
if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(fs); }
else if (fileExt == ".xls") { workbook = new HSSFWorkbook(fs); }
else { workbook = null; }
if (workbook == null) { return; }
ISheet sheet = workbook.GetSheetAt(0);
IRow row = sheet.GetRow(n);//获取第⼀⾏
if (row != null)//檢查是否有數據,有數據就下移,沒有就直接賦值
{
//将表格内容整体下移
sheet.ShiftRows(n, sheet.LastRowNum, 1);
}
var newrow = sheet.CreateRow(n);
int i = 0;
foreach (string v in RecordData)
{
ICell cell = newrow.GetCell(i);
if (cell == null)
{
cell = newrow.CreateCell(i);
}
cell.SetCellValue(v);
i++;
}
FileStream out2 = new FileStream(filePath, FileMode.Create);
workbook.Write(out2);
out2.Close();
}
}
当时测试其它开源⼯具的时候,发现往数据后⾯添加⾏很容易,但想把最新数据插⼊第⼀⾏却不容易,后⾯才转⼊NPOI的怀抱,因为它有下⾯这个函数,很合适。
// 摘要:
//    Shifts rows between startRow and endRow n number of rows. If you use a negative
//    number, it will shift rows up. Code ensures that rows don't wrap around. Calls
//    shiftRows(startRow, endRow, n, false, false); Additionally shifts merged regions
//    that are completely defined in these rows (ie. merged 2 cells on a row to be
//    shifted).
//
// 参数:
//  startRow:
//    the row to start shifting
//
//  endRow:
//    the row to end shifting
//
//  n:
//    the number of rows to shift
void ShiftRows(int startRow, int endRow, int n);
总结
这个项⽬虽然不⼤,但相⽐我以前做的项⽬,我在尽可能将代码写得规范容易理解。
将两种通讯协议和读写⽂件的功能都写成独⽴的类,使⽤的时候实例化对应类,再调⽤⽅法。
将嵌套过多的程序再提取出独⽴的⽅法,让程序更容易理解,vs中的快速操作和重构真的好⽤。
将运⾏信息和报错信息,尽可能显⽰在界⾯的信息窗⼝上(因为总信息量不⼤,所以在界⾯上显⽰,要不然就直接存为⽇志了),对前期查BUG和后期查问题都很有⽤。
多次使⽤了开源⼯具,⽐如界⾯图标⽤了Sunny.UI,读Excel⽤了NPOI,读ini⽂件⽤了IniRW,让开发简单了很多。现在才发现NuGet这个神器真的不应该,对于⼀些常见的功能实现,使⽤开源⼯具可以⼤幅提⾼⼯作效率,⽽且好的⼯具也更能保证稳定性。不过对于使⽤的开源⼯具遵循怎样的开源协议,不是很明⽩,有些⼯具都没到要遵守什么协议,⽹上查了也不是很明⽩。关于这个有解释清晰的资料的,请留⾔给我,不胜感激。
再次熟悉了委托的使⽤,因为涉及到多线程的运⾏信息都显⽰到界⾯上,现在控件⾃带了Invoke⽅法,使⽤起来⽐以前更简单了:
private delegate void ExecuteWork(string str);
private void test()
{
}
private void RecRunData(string reda)
{
if (reda != lastData&&reda.Length>0)
{
string tim = DateTime.Now.ToLongTimeString() + "." + DateTime.Now.Millisecond.ToString() + "--";
textReceive.Text = tim + reda + "\n" + textReceive.Text;
lastData = reda;
}
}
⽽且还⼀种更简单的,甚⾄不⽤先声明委托⽅法,直接⼀⾏就可以搞定:
鼓芯努⼒⽅向
1. 了解开源⼯具的使⽤规范,对⼯具的使⽤有清晰明确地把握
2. 继续学习c#的编程知识,并将学到的东西在项⽬中应⽤起来
3. 多阅读开源⼯具的源代码,提升⾃⼰的编程思维

本文发布于:2024-09-23 19:13:01,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/216159.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   协议   读取
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议