现场发电机采用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是什么状态,都能判断本地开关处于什么位置。
