现场发电机采用WOODWARD的EGCP-3作为主控制器,通过EGCP-3和2301-D控制柴油机的转速,实现转速平稳控制,EGCP-3和BASLE 电气的DECS-100,来控制发电机的励磁信号,使发电机输出电压平稳。功率管理系统使用CP341作为通信接口和EGCP-3进行基于MOUDBUS通讯协议的通讯,分别读取发电机电压,电流,运行状态,报警状态,故障信息代码,并列运行状态,功率分配等信息,并且按照功率管理系统的计算结果,对并列发电机进行起机和并列运行操作,对解列发电机停车操作。
首先,安装西门子的例程,进行单从站的通讯测试。
然后,多从站的读操作; 测试没有问题后,当时也没特殊需求,就直接发到船厂了。 结果,现场又提了远程操作需求,这样的话涉及给从站写命令。所以, 继续单机写操作,没有毛病; 多机写操作,也没有问题。 然后当把读写程序都开放测试时,问题出现了。 当写操作进行时,读操作会偶发性的中断,两个通讯请求的时序匹配问题,导致读上来的参数混乱。
后来把读写通讯优化才得以解决。把读写放到一个判断跳转块中。 L 6 T "SendLength"
L "Data_Segment_Index" JL LSTX JU SEG0 JU SEG1 JU SEG2 JU SEG3 JU SEG4 JU SEG5 JU SEG6 JU SEG7 //写数据 LSTX: JU end
//fuction code is 2 Read Input Status SEG0: L "GEN_No" T "SOURCE_DB".slave_address L 2 T "SOURCE_DB".function_code L 6 T "SOURCE_DB".DATA_ADDR L 32 T "SOURCE_DB".DATA_LENGTH
L 0 //0,1,2,3 T "RecvDataOffset" //DBB_NO. the received blocks start address
JU end
//fuction code is 2 Read Input Status SEG1: L "GEN_No" T "SOURCE_DB".slave_address L 2 T "SOURCE_DB".function_code L 38 T "SOURCE_DB".DATA_ADDR L 32 T "SOURCE_DB".DATA_LENGTH
L 4 //4,5,6,7 T "RecvDataOffset" JU end
//fuction code is 2 Read Input Status SEG2: L "GEN_No" T "SOURCE_DB".slave_address L 2 T "SOURCE_DB".function_code L 81 T "SOURCE_DB".DATA_ADDR L 32 T "SOURCE_DB".DATA_LENGTH
L 8 //8,9,10,11 T "RecvDataOffset" JU end
SEG3: L "GEN_No" T "SOURCE_DB".slave_address L 2 T "SOURCE_DB".function_code L 136 T "SOURCE_DB".DATA_ADDR L 32 T "SOURCE_DB".DATA_LENGTH
L 12 //12,13,14,15 T "RecvDataOffset" JU end
SEG4: L "GEN_No" T "SOURCE_DB".slave_address L 4 T "SOURCE_DB".function_code L 5 T "SOURCE_DB".DATA_ADDR L 24 T "SOURCE_DB".DATA_LENGTH
L 20 //20-66word T "RecvDataOffset" JU end
SEG5: L "GEN_No" T "SOURCE_DB".slave_address
L 4 T "SOURCE_DB".function_code
L 58 T "SOURCE_DB".DATA_ADDR
L 24 T "SOURCE_DB".DATA_LENGTH
L 68 //68--114 T "RecvDataOffset" JU end
SEG6: L "GEN_No" T "SOURCE_DB".slave_address L 4 T "SOURCE_DB".function_code L 106 T "SOURCE_DB".DATA_ADDR L 24 T "SOURCE_DB".DATA_LENGTH
L 116 //116--164 T "RecvDataOffset" JU end
//写数据到EGCP SEG7: NOP 0
A "Mode_Write_Modma".GEN5_Mode_W_R JCN _w5 L 5 T "GEN_No" _w5: NOP 0
说起来貌似很惬意,很轻松,但是当时确实费了不少功夫。看看我的备份程序记录:
EGCP-3要求auto=1, run=0时可由Modbus远程启停机,即此情况下才能执行网络写操作。
当前的情况是本地开关在STANDBY模式下,可以通过网络进行AUTO,OFF,STANDBY的切换。 当前的EGCP-3输出auto,run ,test状态虽然读到 hmi上,但是只有本地开关在除了STANDBY以外的位置时,读到的状态和本地开关的位置一致; 当本地开关置于STANDBY时,经过网络写操作,读上来的状态有可能为OFF,STANDBY,AUTO。 也就是说,如果不知道本地开关的状态,只依据网络读上来的状态,并不能判断本地开关处于什么位置。
现在的解决方法是:把各个本地开关的STANDBY信号引入 plc的DI端子,这样无论读上来的EGCP是什么状态,都能判断本地开关处于什么位置。
来源:西门子工业技术论坛 |