1. 项目背景与需求分析
起重机作为工业现场常见的重型设备,其运行状态直接关系到生产安全和效率。传统起重机监控系统存在几个痛点:
- 高空维护困难:起重机通常安装在厂房高处,物理检查需要停机并搭设脚手架,每次维护耗时耗力
- 实时性不足:传统PLC监控依赖固定工控机或HMI,管理人员无法随时随地掌握设备状态
- 故障响应慢:异常发生时,操作人员可能无法及时察觉,导致问题扩大
这个项目正是为了解决这些问题而开发的移动监控方案。通过Xamarin跨平台技术,将西门子S7-1200 PLC的监控功能延伸到Android手机端,实现了:
- 7×24小时实时状态监控
- 多级语音报警即时提醒
- 历史数据记录与分析
- 远程基础控制功能
2. 技术选型与架构设计
2.1 跨平台框架选择
为什么选择Xamarin.Forms而不是原生开发或其他跨平台方案?
- 技术栈统一:企业已有C#/.NET技术积累,可复用现有代码和开发经验
- 性能平衡:相比React Native等方案,Xamarin编译为原生代码,性能损失小于5%
- 开发效率:共享业务逻辑代码,Android/iOS平台UI代码复用率可达75%
- 生态完善:NuGet包管理器提供丰富的工业通信协议支持
csharp复制// 典型Xamarin.Forms初始化代码
public class MainActivity : FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
}
2.2 通信协议实现
与西门子S7-1200 PLC通信采用S7NetPlus库,这是.NET平台最成熟的S7协议实现:
csharp复制// PLC连接配置示例
var plc = new Plc(CpuType.S71200, "192.168.0.1", 0, 1);
await plc.OpenAsync();
// 读取DB块数据
var status = plc.Read("DB1.DBW0");
关键参数说明:
- 端口102默认用于S7通信
- 机架号(Rack)/插槽号(Slot)需与PLC硬件配置一致
- DB块地址遵循西门子寻址规范
2.3 应用架构设计
项目采用MVVM模式分层架构:
code复制JXQZ/
├── Models/ // 数据模型
│ ├── PlcData.cs
│ └── Alarm.cs
├── ViewModels/ // 业务逻辑
│ ├── MainViewModel.cs
│ └── AlarmViewModel.cs
├── Views/ // 用户界面
│ ├── MainPage.xaml
│ └── AlarmPage.xaml
└── Services/
├── PlcService.cs // PLC通信服务
└── AudioService.cs // 语音报警服务
3. 核心功能实现细节
3.1 实时数据监控
采用双缓冲机制保证数据显示流畅:
- 后台线程:每200ms读取一次PLC数据
- 数据缓存:使用ConcurrentDictionary存储最新值
- UI更新:通过Device.BeginInvokeOnMainThread同步到界面
csharp复制// PLC数据读取服务
public async Task StartMonitoring()
{
while (!_cancellationToken.IsCancellationRequested)
{
var data = await _plc.ReadBytesAsync(DataType.DataBlock, 1, 0, 20);
UpdateDataBuffer(data);
await Task.Delay(200);
}
}
3.2 多级报警系统
报警分为四个级别,对应不同的处理流程:
| 错误级别 | 错误码范围 | 响应方式 | 语音提示 | 记录方式 |
|---|---|---|---|---|
| 普通错误 | 00-05 | 提示音 | 00err.mp3 | 本地日志 |
| 一级报警 | 10-13 | 语音报警 | 10err.mp3 | 数据库+短信 |
| 二级报警 | 100-113 | 声光报警 | 100err.mp3 | 数据库+邮件 |
| 紧急故障 | 200-213 | 自动停机 | 200err.mp3 | 全渠道通知 |
3.3 数据持久化方案
采用SQLite+Excel双备份机制:
- SQLite:存储高频采样数据(5秒/次),使用Entity Framework Core操作
- Excel导出:每日生成报表,通过NPOI库实现
csharp复制// 数据记录服务
public void LogData(PlcRecord record)
{
_dbContext.Records.Add(record);
if(_dbContext.ChangeTracker.Entries().Count() > 100)
{
_dbContext.SaveChanges();
}
}
4. 工业环境适配技巧
4.1 网络可靠性保障
- 心跳检测:每30秒发送心跳包,超时3次自动重连
- 数据缓存:网络中断时本地缓存500条记录
- 多通道备用:支持WiFi/4G双网络切换
4.2 Android系统优化
- 唤醒锁定:防止系统休眠中断监控
xml复制<uses-permission android:name="android.permission.WAKE_LOCK" />
- 前台服务:确保应用在后台持续运行
csharp复制[Service(ForegroundServiceType = ForegroundService.TypeDataSync)]
public class PlcService : Service
{
public override StartCommandResult OnStartCommand(...)
{
StartForeground(1001, BuildNotification());
return StartCommandResult.Sticky;
}
}
5. 实际部署经验
5.1 PLC配置要点
- 优化通信周期:将PLC的通信任务周期设置为100ms
- DB块规划:
- DB1:状态数据(只读)
- DB2:控制命令(只写)
- DB3:报警代码(读写)
5.2 常见问题排查
-
连接超时:
- 检查PLC IP地址是否与手机同网段
- 确认PLC已启用"允许PUT/GET通信"
-
数据不同步:
- 检查PLC的OB块周期设置
- 确认DB块偏移地址正确
-
音频报警失效:
- 验证assets目录文件是否设置为AndroidAsset
- 检查手机媒体音量是否开启
6. 扩展与改进方向
- 预测性维护:基于历史数据训练设备故障预测模型
- AR远程协助:集成ARCore实现远程专家指导
- 多PLC支持:扩展为可管理多台PLC的集中监控平台
这个项目在实际运行中已稳定监控3台起重机超过180天,累计处理报警127次,减少停机时间达45%。移动监控方案确实解决了高空设备维护不便的痛点,下一步计划加入振动数据分析功能,进一步提升预防性维护能力。
