@@ -11,24 +11,27 @@ import com.fizz.business.domain.msg.AppMeasureFurnaceMessage;
import com.fizz.business.dto.MatmapDTO ;
import com.fizz.business.dto.SegValue ;
import com.fizz.business.dto.SegmentDTO ;
import com.fizz.business.domain.s7.DB35501Data ;
import com.fizz.business.domain.s7.DB35502Data ;
import com.fizz.business.form.L1OperateMatForm ;
import com.fizz.business.form.OpcBatchWriteDataForm ;
import com.fizz.business.form.OpcWriteDataForm ;
import com.fizz.business.service.CrmPdiPlanService ;
import com.fizz.business.service.IPdiSetupService ;
import com.fizz.business.service.LogDataService ;
import com.fizz.business.service.OpcDataService ;
import com.fizz.business.service.ProMatmapService ;
import com.fizz.business.service.TrackService ;
import com.fizz.business.service.impl.SegmentService ;
import com.fizz.business.utils.MatmapUtil ;
import com.fizz.business.utils.WebSocketUtil ;
import com.fizz.business.vo.CrmPdiPlanVO ;
import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType ;
import com.github.xingshuangs.iot.protocol.s7.service.S7PLC ;
import com.github.xingshuangs.iot.protocol.s7.serializer.S7Serializer ;
import lombok.RequiredArgsConstructor ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.scheduling.annotation.Async ;
import org.springframework.stereotype.Service ;
import javax.annotation.PostConstruct ;
import java.lang.reflect.Method ;
import java.lang.reflect.Field ;
import java.math.BigDecimal ;
@@ -51,7 +54,37 @@ public class SegmentTrackerService {
private final CrmPdiPlanService crmPdiPlanService ;
private final IPdiSetupService pdiSetupService ;
private final OpcDataService opcDataService ;
private static final String PLC_IP = " 192.168.0.223 " ;
private static final int COIL_ID_MAX_LEN = 20 ;
private S7PLC s7PLC ;
private S7Serializer s7Serializer ;
@PostConstruct
public void initS7 ( ) {
// PLC机型是1500, IP 192.168.0.223, rack/slot 默认
this . s7PLC = new S7PLC ( EPlcType . S1500 , PLC_IP ) ;
this . s7Serializer = S7Serializer . newInstance ( s7PLC ) ;
}
private String trimToLen ( String s , int maxLen ) {
if ( s = = null ) {
return null ;
}
return s . length ( ) < = maxLen ? s : s . substring ( 0 , maxLen ) ;
}
private float toFloat ( BigDecimal v ) {
return v = = null ? 0 . 0f : v . floatValue ( ) ;
}
private byte toByte ( String s ) {
if ( s = = null | | s . isEmpty ( ) ) {
return 0 ;
}
return ( byte ) s . charAt ( 0 ) ;
}
private static final long intervalTime = 10000 ; // 每 10 秒写一次
private int traceCount = 0 ;
@@ -468,64 +501,52 @@ public class SegmentTrackerService {
}
/**
* NEW/READY -> ONLINE: 下发 全线张力“下一设定值”(Next)
*/
private void addDriveTensionNextFields ( List < OpcWriteDataForm > dataList , Integer porIdx , PdiSetups setup ) {
if ( setup = = null ) {
return ;
}
if ( porIdx ! = null & & porIdx = = 0 ) {
dataList . add ( buildOpcWrite ( " tensionPor1Next " , setup . getPorTension ( ) ) ) ;
} else if ( porIdx ! = null & & porIdx = = 1 ) {
dataList . add ( buildOpcWrite ( " tensionPor2Next " , setup . getPorTension ( ) ) ) ;
}
dataList . add ( buildOpcWrite ( " tensionEnLpNext " , setup . getCelTension ( ) ) ) ;
dataList . add ( buildOpcWrite ( " tensionCleaningNext " , setup . getCleanTension ( ) ) ) ;
dataList . add ( buildOpcWrite ( " tensionGalvanizingCoolNext " , setup . getPassivationTension ( ) ) ) ;
dataList . add ( buildOpcWrite ( " tensionExLpNext " , setup . getCxlTension ( ) ) ) ;
dataList . add ( buildOpcWrite ( " tensionTlNext " , setup . getLevelerEntryTension ( ) ) ) ;
dataList . add ( buildOpcWrite ( " tensionTmExitNext " , setup . getStraightenerExitTension ( ) ) ) ;
dataList . add ( buildOpcWrite ( " tensionFuranceNext " , setup . getFurTension ( ) ) ) ;
dataList . add ( buildOpcWrite ( " tensionTrNext " , setup . getTrTension ( ) ) ) ;
}
private void addEntryPdiFields ( List < OpcWriteDataForm > dataList , String coilId , CrmPdiPlanVO plan ) {
dataList . add ( buildOpcWrite ( " coilId " , coilId ) ) ;
dataList . add ( buildOpcWrite ( " entryCoilWeight " , plan . getEntryWeight ( ) ) ) ;
dataList . add ( buildOpcWrite ( " entryCoilLength " , plan . getEntryLength ( ) ) ) ;
dataList . add ( buildOpcWrite ( " entryCoilWidth " , plan . getEntryWidth ( ) ) ) ;
dataList . add ( buildOpcWrite ( " entryCoilThick " , plan . getEntryThick ( ) ) ) ;
dataList . add ( buildOpcWrite ( " entryCoilInnerDia " , plan . getEntryInnerDiameter ( ) ) ) ;
dataList . add ( buildOpcWrite ( " entryCoilOuterDia " , plan . getEntryOuterDiameter ( ) ) ) ;
dataList . add ( buildOpcWrite ( " alloyCode " , plan . getSteelGrade ( ) ) ) ;
}
/**
* NEW/READY -> ONLINE: 入口卷参数 + 全线张力“下一设定值”(Next) 一次性下发
* NEW/READY -> ONLINE: 入口卷参数 + 全线张力“下一设定值”(Next) 一次性下发 (通过 S7 协议直连 PLC)
*/
public void sendAllPdiOnOnline ( String coilId , Integer porIdx ) {
try {
CrmPdiPlanVO plan = crmPdiPlanService . getByCoilIdAndOperId ( coilId ) ;
PdiSetups setup = loadPdiSetup ( coilId , plan . getPlanid ( ) ) ;
List < OpcWriteDataForm > dataList = new ArrayList < > ( ) ;
addEntryPdiFields ( dataList , coilId , plan ) ;
addDriveTensionNextFields ( dataList , porIdx , setup ) ;
OpcBatchWriteDataForm opcForm = new OpcBatchWriteDataForm ( ) ;
opcForm . setDataList ( dataList ) ;
boolean ok = opcDataService . batchWriteData ( opcForm ) ;
logDataService . logInfo ( " MATMAP-TRACK " , " ONLINE下发完成(入口参数+张力Next), coilId= " + coilId + " , ok= " + ok ) ;
// 1. 组装 DB35501 数据 (入口卷参数)
DB35501Data d35501 = new DB35501Data ( ) ;
d35501 . setCoilId ( trimToLen ( coilId , COIL_ID_MAX_LEN ) ) ;
d35501 . setEntryCoilWeight ( toFloat ( plan . getEntryWeight ( ) ) ) ;
d35501 . setEntryCoilLength ( toFloat ( plan . getEntryLength ( ) ) ) ;
d35501 . setEntryCoilWidth ( toFloat ( plan . getEntryWidth ( ) ) ) ;
d35501 . setEntryCoilThick ( toFloat ( plan . getEntryThick ( ) ) ) ;
d35501 . setEntryCoilInnerDia ( toFloat ( plan . getEntryInnerDiameter ( ) ) ) ;
d35501 . setEntryCoilOuterDia ( toFloat ( plan . getEntryOuterDiameter ( ) ) ) ;
d35501 . setAlloyCode ( toByte ( plan . getSteelGrade ( ) ) ) ;
// 2. 组装 DB35502 数据 (全线张力 Next)
DB35502Data d35502 = new DB35502Data ( ) ;
if ( setup ! = null ) {
if ( porIdx ! = null & & porIdx = = 0 ) {
d35502 . setTensionPor1Next ( toFloat ( setup . getPorTension ( ) ) ) ;
} else if ( porIdx ! = null & & porIdx = = 1 ) {
d35502 . setTensionPor2Next ( toFloat ( setup . getPorTension ( ) ) ) ;
}
d35502 . setTensionEnLpNext ( toFloat ( setup . getCelTension ( ) ) ) ;
d35502 . setTensionCleaningNext ( toFloat ( setup . getCleanTension ( ) ) ) ;
d35502 . setTensionGalvanizingCoolNext ( toFloat ( setup . getPassivationTension ( ) ) ) ;
d35502 . setTensionExLpNext ( toFloat ( setup . getCxlTension ( ) ) ) ;
d35502 . setTensionTlNext ( toFloat ( setup . getLevelerEntryTension ( ) ) ) ;
d35502 . setTensionTmExitNext ( toFloat ( setup . getStraightenerExitTension ( ) ) ) ;
d35502 . setTensionFuranceNext ( toFloat ( setup . getFurTension ( ) ) ) ;
d35502 . setTensionTrNext ( toFloat ( setup . getTrTension ( ) ) ) ;
}
// 3. 执行 S7 序列化写入
s7Serializer . write ( d35501 ) ;
s7Serializer . write ( d35502 ) ;
private OpcWriteDataForm buildOpcWrite ( String fieldName , Object value ) {
OpcWriteDataForm form = new OpcWriteDataForm ( ) ;
form . setFieldName ( fieldName ) ;
form . s etValue ( valu e) ;
return form ;
logDataService . logInfo ( " MATMAP-TRACK " , " ONLINE S7下发完成(入口参数+张力Next), coilId= " + coilId + " , PLC= " + PLC_IP ) ;
} catch ( Exception e ) {
log . error ( " S7下发异常: {} " , e . g etMessage ( ) , e) ;
logDataService . logError ( " MATMAP-TRACK " , " ONLINE S7下发失败, coilId= " + coilId + " , err= " + e . getMessage ( ) ) ;
}
}
}