S7 模拟器当前通过本地 JSON 文件手动配置实例和协议模板,工作量大且容易出错。WCS 系统已有完整的设备信息数据库(SQL Server),包含 Dt_DeviceInfo 和 Dt_DeviceProtocol 表。需要实现从数据库自动同步设备到 S7 模拟器实例。
Dt_DeviceInfo.DevicePlcType = 'SiemensS7'Dt_DeviceProtocol 字段启动时 / API触发
│
▼
┌─────────────────────────────┐
│ InstanceSyncService │
│ (Application 层) │
└─────────────┬───────────────┘
│ 读取 Dt_DeviceInfo (DevicePlcType='SiemensS7')
│ 读取 Dt_DeviceProtocol (按 DeviceId 关联)
▼
┌─────────────────────────────┐
│ DatabaseDeviceService │
│ (Application 层) │
│ - SqlSugar 连接 WCS DB │
└─────────────┬───────────────┘
│ InstanceConfig + ProtocolTemplate
▼
┌─────────────────────────────┐
│ SimulatorInstanceManager │
│ - 创建/更新实例 │
│ - 应用内存默认值 │
└─────────────────────────────┘
| 组件 | 位置 | 职责 |
|---|---|---|
WcsDbOptions |
Application | 数据库连接配置类 |
DatabaseDeviceService |
Application | 读取 WCS 设备数据 |
InstanceSyncService |
Application | 同步逻辑 |
SyncController |
Server | API 接口 |
appsettings.json 添加:
{
"WcsDb": {
"Enabled": true,
"ConnectionString": "Data Source=.;Initial Catalog=WIDESEAWCS_ShanMei;User ID=sa;Password=${WCS_DB_PASSWORD};...",
"DbType": 2
}
}
Note: DbType uses integer values (SqlServer=2, MySql=1). ${WCS_DB_PASSWORD} is an environment variable placeholder.
| Dt_DeviceProtocol 字段 | ProtocolTemplate 字段 |
|---|---|
DeviceChildCode |
fieldKey |
DeviceProDataBlock |
dbNumber |
DeviceProOffset |
offset |
DeviceProDataType |
dataType(需转换映射) |
DeviceProDataLength |
length |
固定值 1 |
bit |
Bidirectional (2) |
direction |
ProtocolDataType 枚举值:Byte=0, Int=1, DInt=2, String=3, Bool=4
| 数据库 DeviceProDataType | ProtocolDataType |
|---|---|
Bit |
Bool (4) |
Byte |
Byte (0) |
Int, Word |
Int (1) |
DInt |
DInt (2) |
String, String8, String16 |
String (3) |
new MemoryRegionConfig
{
MRegionSize = 1024,
DBBlockCount = 1,
DBBlockNumbers = new List<int> { 50 },
DBBlockSize = 65536,
IRegionSize = 256,
QRegionSize = 256,
TRegionCount = 64,
CRegionCount = 64
}
protocol-{DeviceCode}
每个设备(DeviceCode)生成一个协议模板,包含该设备所有 DeviceChildCode 的协议字段。
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/Sync/SyncInstances |
手动触发同步 |
| GET | /api/Sync/LastSyncTime |
获取上次同步时间 |
DevicePlcType = 'SiemensS7' 的设备InstanceConfig(ID = DeviceCode,端口 = DevicePort)Dt_DeviceProtocol 记录生成协议模板WIDESEAWCS_S7Simulator.Application/WcsDbOptions.csWIDESEAWCS_S7Simulator.Application/DatabaseDeviceService.csWIDESEAWCS_S7Simulator.Application/InstanceSyncService.csWIDESEAWCS_S7Simulator.Server/Controllers/SyncController.csWIDESEAWCS_S7Simulator.Server/appsettings.json - 添加 WcsDb 配置WIDESEAWCS_S7Simulator.Server/Program.cs - 注册服务、启动时同步