Parcourir la source

完善 。S7 ,在枚举类中进行read/write操作

master
caixiang il y a 2 ans
Parent
révision
6c3e537e6f
4 fichiers modifiés avec 220 ajouts et 323 suppressions
  1. +46
    -29
      src/main/java/com/qgs/dc/s7/controller/S7DemoController.java
  2. +1
    -0
      src/main/java/com/qgs/dc/s7/my/s7connector/enmuc/PlcVarActual.java
  3. +173
    -1
      src/main/java/com/qgs/dc/s7/my/s7connector/enmuc/S7Client.java
  4. +0
    -293
      src/main/java/com/qgs/dc/s7/my/s7connector/service/S7Service.java

+ 46
- 29
src/main/java/com/qgs/dc/s7/controller/S7DemoController.java Voir le fichier

@@ -4,7 +4,7 @@ import com.qgs.dc.opcua.controller.R;
import com.qgs.dc.s7.my.s7connector.enmuc.PlcVarActual;
import com.qgs.dc.s7.my.s7connector.enmuc.S7Client;

import com.qgs.dc.s7.my.s7connector.service.S7Service;
import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -21,14 +21,14 @@ import java.util.Random;
public class S7DemoController {
private static final Logger logger = LoggerFactory.getLogger(S7DemoController.class);

@Autowired
S7Service s7Service;


//demo1
@PostMapping("/testReadAll")
public R testReadAll() throws UnsupportedEncodingException, ParseException {
for(PlcVarActual actual:PlcVarActual.values()){
System.out.println(s7Service.read(actual,S7Client.S7_1500));;
System.out.println(read(S7Client.S7_1500,actual));

}
return R.ok();
}
@@ -36,28 +36,28 @@ public class S7DemoController {
//demo2
@PostMapping("/readTest")
public R getTestForS7() throws UnsupportedEncodingException, ParseException {
Boolean heartBeat = (Boolean)s7Service.read(PlcVarActual.HeartBeat,S7Client.S7_1500);
String ddtl = (String)s7Service.read(PlcVarActual.DTL,S7Client.S7_1500);
List<Character> characters = (List<Character>)s7Service.read(PlcVarActual.CharArrays,S7Client.S7_1500);
Boolean heartBeat = (Boolean)read(S7Client.S7_1500,PlcVarActual.HeartBeat);
String ddtl = (String)read(S7Client.S7_1500,PlcVarActual.DTL);
List<Character> characters = (List<Character>)read(S7Client.S7_1500,PlcVarActual.CharArrays);

List<Boolean> booleans = (List<Boolean>)s7Service.read(PlcVarActual.BooleanArrays,S7Client.S7_1500);
String stri = (String)s7Service.read(PlcVarActual.STRING1,S7Client.S7_1500);
List<Boolean> booleans = (List<Boolean>)read(S7Client.S7_1500,PlcVarActual.BooleanArrays);
String stri = (String)read(S7Client.S7_1500,PlcVarActual.STRING1);

return R.ok().put("res",heartBeat).put("characters",characters).put("ddtl",ddtl).put("bools",booleans).put("str",stri);
}

@PostMapping("/readTest2")
public R getTest2ForS7() throws UnsupportedEncodingException, ParseException {
// List<Character> characters = (List<Character>)s7Service.read(PlcVarActual.CharArrays,S7Client.S7_1500);
// List<Character> characters = (List<Character>)read(PlcVarActual.CharArrays,S7Client.S7_1500);
//
// List<Boolean> booleans = (List<Boolean>)s7Service.read(PlcVarActual.BooleanArrays,S7Client.S7_1500);
// String stri = (String)s7Service.read(PlcVarActual.STRING1,S7Client.S7_1500);
// List<Boolean> booleans = (List<Boolean>)read(PlcVarActual.BooleanArrays,S7Client.S7_1500);
// String stri = (String)read(PlcVarActual.STRING1,S7Client.S7_1500);
//
// return R.ok().put("res",heartBeat).put("characters",characters).put("ddtl",ddtl).put("bools",booleans).put("str",stri);
String con = "1233ADSDA";
s7Service.write(PlcVarActual.STRING1, con, S7Client.S7_1500);
String read = (String)s7Service.read(PlcVarActual.STRING1, S7Client.S7_1500);
String sub0 = (String)s7Service.read(PlcVarActual.SUBID0, S7Client.S7_1500);
write(S7Client.S7_1500,PlcVarActual.STRING1, con);
String read = (String)read(S7Client.S7_1500,PlcVarActual.STRING1);
String sub0 = (String)read(S7Client.S7_1500,PlcVarActual.SUBID0);


return R.ok().put("str",read).put("sub0",sub0);
@@ -67,8 +67,8 @@ public class S7DemoController {
public R testForStrings() throws UnsupportedEncodingException, ParseException {
//测试结果 l => 66ms
long l = System.currentTimeMillis();
String string = (String)s7Service.read(PlcVarActual.STRING1, S7Client.S7_1500);
String[] subs = (String[])s7Service.read(PlcVarActual.SubIdArrays, S7Client.S7_1500);
String string = (String)read(S7Client.S7_1500,PlcVarActual.STRING1);
String[] subs = (String[])read(S7Client.S7_1500,PlcVarActual.SubIdArrays);
long l1 = System.currentTimeMillis();

String[] toWrite = new String[60];
@@ -78,13 +78,13 @@ public class S7DemoController {
}
////测试结果 c => 57ms
long c1 = System.currentTimeMillis();
s7Service.write(PlcVarActual.SubIdArrays,toWrite,S7Client.S7_1500);
write(S7Client.S7_1500,PlcVarActual.SubIdArrays,toWrite);
long c2 = System.currentTimeMillis();
String s = "cai xiang";
s7Service.write(PlcVarActual.STRING1,s,S7Client.S7_1500);
write(S7Client.S7_1500,PlcVarActual.STRING1,s);

String string2 = (String)s7Service.read(PlcVarActual.STRING1, S7Client.S7_1500);
String[] subs2 = (String[])s7Service.read(PlcVarActual.SubIdArrays, S7Client.S7_1500);
String string2 = (String)read(S7Client.S7_1500,PlcVarActual.STRING1);
String[] subs2 = (String[])read(S7Client.S7_1500,PlcVarActual.SubIdArrays);

return R.ok().put("l",(l1-l)).put("c",(c2-c1));
}
@@ -93,7 +93,7 @@ public class S7DemoController {
public R testForString1200() throws UnsupportedEncodingException, ParseException {
//测试结果 l => 66ms
long l = System.currentTimeMillis();
String[] subs = (String[])s7Service.read(PlcVarActual.SubIdArrays1200, S7Client.S7_1200);
String[] subs = (String[])read(S7Client.S7_1200,PlcVarActual.SubIdArrays1200);
long l1 = System.currentTimeMillis();

String[] toWrite = new String[60];
@@ -103,39 +103,56 @@ public class S7DemoController {
}
////测试结果 c => 57ms
long c1 = System.currentTimeMillis();
s7Service.write(PlcVarActual.SubIdArrays1200,toWrite,S7Client.S7_1200);
write(S7Client.S7_1200,PlcVarActual.SubIdArrays1200,toWrite);
long c2 = System.currentTimeMillis();


String[] subs2 = (String[])s7Service.read(PlcVarActual.SubIdArrays1200, S7Client.S7_1200);
String[] subs2 = (String[])read(S7Client.S7_1200,PlcVarActual.SubIdArrays1200);

return R.ok().put("l",(l1-l)).put("c",(c2-c1));
}
@PostMapping("/testFor1200")
public R testFor1200() throws UnsupportedEncodingException, ParseException {
Object subs = s7Service.read(PlcVarActual.INT1200, S7Client.S7_1200);
//Object subs = read(PlcVarActual.INT1200, S7Client.S7_1200);
Object read = read(S7Client.S7_1200, PlcVarActual.SubIdArrays1200);

String[] toWrite = new String[60];
for(int i=0;i<60;i++){
int i1 = new Random().nextInt(100);
toWrite[i] = "2212"+ i1;
}
write(S7Client.S7_1200,PlcVarActual.SubIdArrays1200,toWrite);

Object read2 = read(S7Client.S7_1200, PlcVarActual.SubIdArrays1200);
return R.ok();
}

//PlcVarActual 到时候改成你们的 xxxPlcToWcs 或者 xxxWcsToPlc
private Object read(S7Client s7Client,PlcVarActual var) throws UnsupportedEncodingException, ParseException {
return s7Client.read(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getLength(), var.getStrSize(), var.getType());
}
private void write(S7Client s7Client,PlcVarActual var,Object newValue) {
s7Client.write(var.getArea(), var.getAreaNumber(), var.getByteOffset(), var.getBitOffset(), var.getStrSize(), var.getType(),newValue);
}

//demo3
@PostMapping("/writeTest")
public R writeTest() throws PlcConnectionException, UnsupportedEncodingException {
s7Service.write(PlcVarActual.HeartBeat, false, S7Client.S7_1500);
write(S7Client.S7_1500,PlcVarActual.HeartBeat, false);

char[] charArrays_content = new char[2];
charArrays_content[0] = '1';
charArrays_content[1] = 'c';
s7Service.write(PlcVarActual.CharArrays, charArrays_content, S7Client.S7_1500);
write( S7Client.S7_1500,PlcVarActual.CharArrays, charArrays_content);

boolean[] boolArrays_content = new boolean[2];
boolArrays_content[0] = true;
boolArrays_content[1] = false;
s7Service.write(PlcVarActual.BooleanArrays, boolArrays_content, S7Client.S7_1500);
write(S7Client.S7_1500,PlcVarActual.BooleanArrays, boolArrays_content);

String str = "你好啊aa";
//todo string 的读写有问题 待会看看
s7Service.write(PlcVarActual.STRING1, str, S7Client.S7_1500);
write(S7Client.S7_1500,PlcVarActual.STRING1, str);
return R.ok().put("res",true);
}



+ 1
- 0
src/main/java/com/qgs/dc/s7/my/s7connector/enmuc/PlcVarActual.java Voir le fichier

@@ -54,6 +54,7 @@ public enum PlcVarActual {
this.areaNumber = areaNumber;
this.byteOffset = byteOffset;
this.bitOffset = bitOffset;
this.strSize = 0;
}
PlcVarActual(String name, PlcVar type,Integer length, DaveArea area, Integer areaNumber, Integer byteOffset, Integer bitOffset,Integer strSize){
this.name = name;


+ 173
- 1
src/main/java/com/qgs/dc/s7/my/s7connector/enmuc/S7Client.java Voir le fichier

@@ -1,10 +1,15 @@
package com.qgs.dc.s7.my.s7connector.enmuc;

import com.qgs.dc.s7.my.s7connector.api.DaveArea;
import com.qgs.dc.s7.my.s7connector.api.S7Connector;
import com.qgs.dc.s7.my.s7connector.api.factory.S7ConnectorFactory;
import com.qgs.dc.s7.my.s7connector.api.utils.ByteUtils;
import com.qgs.dc.s7.my.s7connector.type.PlcVar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
@@ -17,7 +22,7 @@ import java.util.concurrent.ScheduledExecutorService;
*/
public enum S7Client {
//TODO 步骤1 这里是配置多PLC 的,,,有多个plc 就在这里配置一个枚举类
//1500 虽然设备上显示机架-0 插槽-1(这个是默认的) 但是我们这里 rack、slot 都是0,反正我们这里就让电控rack和solt都是默认的 然后我们这边都配置0就行了。
//1500 西门子200smart、1200、1500默认的 机架号=0 槽位号=1; 300/400 默认的 机架-0 插槽-2
S7_1500("192.168.0.51",0,1,3,PlcVarActual.HeartBeat),
//1500 机架-0 插槽-1
S7_1200("192.168.0.52",0,1,3,PlcVarActual.HeartBeatFor1200)
@@ -65,9 +70,175 @@ public enum S7Client {
check_ping();
}

/**
* PlcVar(byte[]) 转 java对象 对照表
* 单体变量
* Bool ===> Boolean
* LREAL ===> Double
* REAL ===> Float
* DATE ===> String(yyyy-MM-dd 这种形式的类型)
* DTL ===> String("年-月-日-工作日-时-分-秒" 这种格式)
* TIME ===> Integer(单位 ms)
* USINT ===> Integer
* SINT ===> Integer
* UINT ===> Integer
* INT ===> Integer
* DINT ===> Integer
* UINT ===> Long
* Byte ===> Integer(有符号)(默认)
* Integer(无符号)(后续扩展)
* Char ===> Character
* WChar ===> Character
* String ===> String (特殊)


* 数组变量
* BoolArray ===> List<Boolean>
* ByteArray ===> List<Byte>
* WordArray ===> List<Integer>
* DWordArray ===> List<Integer>
* CharArray ===> List<Character>
* SIntArray ===> List<Integer>
* IntArray ===> List<Integer>
* DIntArray ===> List<Integer>
* UIntArray ===> List<Integer>
* USIntArray ===> List<Integer>
* UDIntArray ===> List<Long>
* StringArray ===> String[] (特殊)
*
*
* */
public Object read(DaveArea area, Integer areaNumber, Integer byteOffset, Integer bitOffset, Integer length, Integer strSizes, PlcVar type) throws UnsupportedEncodingException, ParseException {
S7Connector connector = getConnector();
//String 类型比较特殊。 String[] 也是同理,Sring数组里面的子项 也是有两个字节的 readBytes。
if(type.equals(PlcVar.STRING)){
Integer readBytes = 2;
byte[] read = connector.read(
area,
areaNumber,
readBytes,
byteOffset,
bitOffset,
type.getTransportSize()
);

Integer allLength = Integer.valueOf(read[1])+2;
byte[] readF = connector.read(
area,
areaNumber,
allLength,
byteOffset,
bitOffset,
type.getTransportSize()
);
return type.toObject(readF);
}else if(type.equals(PlcVar.STRING_Array)){
Integer arrayLength = length;
Integer strSize = strSizes;

byte[] read = connector.read(
area,
areaNumber,
arrayLength*(strSize+2),
byteOffset,
bitOffset,
type.getTransportSize()
);
return ByteUtils.toStrArray(read, arrayLength, strSize);
}else {
Integer readBytes = type.getTransportSize().getSizeInBytes() * length;
byte[] read = connector.read(
area,
areaNumber,
readBytes,
byteOffset,
bitOffset,
type.getTransportSize()
);
return type.toObject(read);
}
}

/**
*
* eg :
* Object newValue = Boolean.FALSE
* s7Service.write(PlcVarActual.HeartBeat, newValue, S7Client.S7_1200);
*
* PlcVar(byte[]) 转 java对象 对照表
* 单体变量
* Bool ===> Object newValue = Boolean.FALSE
* LREAL ===> Object newValue = Boolean.FALSE
* REAL ===> Object newValue = Boolean.FALSE
* DATE ===> 暂时没需求(有问题找我)
* DTL ===> 暂时没需求(有问题找我)
* TIME ===> 暂时没需求(有问题找我)
* USINT ===> Object newValue = new Integer(1)
* SINT ===> Object newValue = new Integer(1)
* UINT ===> Object newValue = new Integer(1)
* INT ===> Object newValue = new Integer(1)
* DINT ===> Object newValue = new Integer(1)
* UINT ===> Object newValue = new Integer(1)
* Byte ===> Object newValue = 0x11
*
* Char ===> Object newValue = 'a'
* WChar ===> Object newValue = '菜'
* String ===> Object newValue = '你好啊' (特殊)


* 数组变量
* 注意:在write的时候,你write的数量 一定要和 plc中存在的数量一一对应
* BoolArray ===> boolean[] booleanArray = new boolean[2]; .... 赋予值
* ByteArray ===> byte[] write_byteArrays = new byte[2];
* WordArray ===> short[] shortArrays_content = new short[2];
* DWordArray ===> int[] intArrays_content = new int[2];
* CharArray ===> char[] charArrays_content = new char[2];
* SIntArray ===> int[] sintArrays_content = new int[2];
* IntArray ===> int[] iintArrays_content = new int[2];
* DIntArray ===> int[] dintArrays_content = new int[2];
* UIntArray ===> int[] uintArrays_content = new int[3];
* USIntArray ===> int[] usintArrays_content = new int[3];
* UDIntArray ===> int[] udintArrays_content = new int[3];
* StringArray ===> String[] stringArrays_content = new String[3];
* //如果有其他数据类型 这里没有找我扩展
*
*
* */
public void write(DaveArea area, Integer areaNumber, Integer byteOffset, Integer bitOffset,Integer strSize, PlcVar type, Object newValue){
S7Connector connector = getConnector();

//String 类型比较特殊。 String[] 也是同理,Sring数组里面的子项 也是有两个字节的 readBytes。
if(type.equals(PlcVar.STRING)){
connector.write(
area,
areaNumber,
byteOffset,
bitOffset,
ByteUtils.strToBytes(newValue.toString(), strSize),
type
);
}else if(type.equals(PlcVar.STRING_Array)){
//todo here 检查 read write service
connector.write(
area,
areaNumber,
byteOffset,
bitOffset,
ByteUtils.strArrayToBytes((String[])newValue, strSize),
type
);
}else {
byte[] bytes = type.toBytes(newValue);
connector.write(
area,
areaNumber,
byteOffset,
bitOffset,
bytes,
type
);
}
}


public S7Connector getConnector() {
@@ -77,6 +248,7 @@ public enum S7Client {
pickOne = (pickOne)%size;
return s7Connector;
}

private S7Connector connect(String host,Integer rack,Integer slot ){
try {
S7Connector connector = S7ConnectorFactory


+ 0
- 293
src/main/java/com/qgs/dc/s7/my/s7connector/service/S7Service.java Voir le fichier

@@ -1,293 +0,0 @@
package com.qgs.dc.s7.my.s7connector.service;

import com.qgs.dc.s7.my.s7connector.api.DaveArea;
import com.qgs.dc.s7.my.s7connector.api.S7Connector;
import com.qgs.dc.s7.my.s7connector.api.utils.ByteUtils;
import com.qgs.dc.s7.my.s7connector.enmuc.PlcVarActual;
import com.qgs.dc.s7.my.s7connector.enmuc.S7Client;
import com.qgs.dc.s7.my.s7connector.type.PlcVar;
import com.qgs.dc.s7.my.s7connector.type.TransportSize;
import io.netty.channel.EventLoopGroup;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.UnsupportedEncodingException;
import java.text.ParseException;

/**
* @Desc: ""
* @Author: caixiang
* @DATE: 2022/1/17 14:20
*/
//tips: 外部使用这个service的read、write操作 要异常捕捉,然后在catch里面 用logger.info("记录下异常。"),这里的异常是不会被捕捉的只会向外抛。
//关于对String、String[]操作需要注意:
// ① 单体变量 length 都是1
// ② 数组变量 length 就是 你要read 或者write数组的长度
// ③ bitOffset 是针对Bool 来说的,其他变量bitOffset 都是0
// ④ strSize 这个字段只是给 String变量 和 String[]变量 用的, 这个字段是plc中设置的最大String长度
// ⑤ String类型 在write的时候禁止 write中文,因为plc中编码并没有采用UTF-8 而是采用ASCII
// (同理也是,当plc中有设置String类型或者StringArray那么告诉他们必须指定长度 通常他们也会指定长度的。)
@Component
public class S7Service {
private final Logger logger = LoggerFactory.getLogger(getClass());
S7Service(){

}

/**
* PlcVar(byte[]) 转 java对象 对照表
* 单体变量
* Bool ===> Boolean
* LREAL ===> Double
* REAL ===> Float
* DATE ===> String(yyyy-MM-dd 这种形式的类型)
* DTL ===> String("年-月-日-工作日-时-分-秒" 这种格式)
* TIME ===> Integer(单位 ms)
* USINT ===> Integer
* SINT ===> Integer
* UINT ===> Integer
* INT ===> Integer
* DINT ===> Integer
* UINT ===> Long
* Byte ===> Integer(有符号)(默认)
* Integer(无符号)(后续扩展)
* Char ===> Character
* WChar ===> Character
* String ===> String (特殊)


* 数组变量
* BoolArray ===> List<Boolean>
* ByteArray ===> List<Byte>
* WordArray ===> List<Integer>
* DWordArray ===> List<Integer>
* CharArray ===> List<Character>
* SIntArray ===> List<Integer>
* IntArray ===> List<Integer>
* DIntArray ===> List<Integer>
* UIntArray ===> List<Integer>
* USIntArray ===> List<Integer>
* UDIntArray ===> List<Long>
* StringArray ===> String[] (特殊)
*
*
* */
public Object read(PlcVarActual plcVarActual,S7Client s7Client) throws UnsupportedEncodingException, ParseException {
S7Connector connector = s7Client.getConnector();
//String 类型比较特殊。 String[] 也是同理,Sring数组里面的子项 也是有两个字节的 readBytes。
if(plcVarActual.getType().equals(PlcVar.STRING)){
Integer readBytes = 2;
byte[] read = connector.read(
plcVarActual.getArea(),
plcVarActual.getAreaNumber(),
readBytes,
plcVarActual.getByteOffset(),
plcVarActual.getBitOffset(),
plcVarActual.getType().getTransportSize()
);

Integer allLength = Integer.valueOf(read[1])+2;
byte[] readF = connector.read(
plcVarActual.getArea(),
plcVarActual.getAreaNumber(),
allLength,
plcVarActual.getByteOffset(),
plcVarActual.getBitOffset(),
plcVarActual.getType().getTransportSize()
);
return plcVarActual.getType().toObject(readF);
}else if(plcVarActual.getType().equals(PlcVar.STRING_Array)){
Integer arrayLength = plcVarActual.getLength();
Integer strSize = plcVarActual.getStrSize();

byte[] read = connector.read(
plcVarActual.getArea(),
plcVarActual.getAreaNumber(),
arrayLength*(strSize+2),
plcVarActual.getByteOffset(),
plcVarActual.getBitOffset(),
plcVarActual.getType().getTransportSize()
);
return ByteUtils.toStrArray(read, arrayLength, strSize);
}else {
Integer readBytes = plcVarActual.getType().getTransportSize().getSizeInBytes() * plcVarActual.getLength();
byte[] read = connector.read(
plcVarActual.getArea(),
plcVarActual.getAreaNumber(),
readBytes,
plcVarActual.getByteOffset(),
plcVarActual.getBitOffset(),
plcVarActual.getType().getTransportSize()
);
return plcVarActual.getType().toObject(read);
}
}
public Object read(DaveArea area, Integer areaNumber, Integer byteOffset, Integer bitOffset, Integer length, Integer strSizes, PlcVar type,S7Client s7Client) throws UnsupportedEncodingException, ParseException {
S7Connector connector = s7Client.getConnector();
//String 类型比较特殊。 String[] 也是同理,Sring数组里面的子项 也是有两个字节的 readBytes。
if(type.equals(PlcVar.STRING)){
Integer readBytes = 2;
byte[] read = connector.read(
area,
areaNumber,
readBytes,
byteOffset,
bitOffset,
type.getTransportSize()
);

Integer allLength = Integer.valueOf(read[1])+2;
byte[] readF = connector.read(
area,
areaNumber,
allLength,
byteOffset,
bitOffset,
type.getTransportSize()
);
return type.toObject(readF);
}else if(type.equals(PlcVar.STRING_Array)){
Integer arrayLength = length;
Integer strSize = strSizes;

byte[] read = connector.read(
area,
areaNumber,
arrayLength*(strSize+2),
byteOffset,
bitOffset,
type.getTransportSize()
);
return ByteUtils.toStrArray(read, arrayLength, strSize);
}else {
Integer readBytes = type.getTransportSize().getSizeInBytes() * length;
byte[] read = connector.read(
area,
areaNumber,
readBytes,
byteOffset,
bitOffset,
type.getTransportSize()
);
return type.toObject(read);
}
}

/**
*
* eg :
* Object newValue = Boolean.FALSE
* s7Service.write(PlcVarActual.HeartBeat, newValue, S7Client.S7_1200);
*
* PlcVar(byte[]) 转 java对象 对照表
* 单体变量
* Bool ===> Object newValue = Boolean.FALSE
* LREAL ===> Object newValue = Boolean.FALSE
* REAL ===> Object newValue = Boolean.FALSE
* DATE ===> 暂时没需求(有问题找我)
* DTL ===> 暂时没需求(有问题找我)
* TIME ===> 暂时没需求(有问题找我)
* USINT ===> Object newValue = new Integer(1)
* SINT ===> Object newValue = new Integer(1)
* UINT ===> Object newValue = new Integer(1)
* INT ===> Object newValue = new Integer(1)
* DINT ===> Object newValue = new Integer(1)
* UINT ===> Object newValue = new Integer(1)
* Byte ===> Object newValue = 0x11
*
* Char ===> Object newValue = 'a'
* WChar ===> Object newValue = '菜'
* String ===> Object newValue = '你好啊' (特殊)


* 数组变量
* 注意:在write的时候,你write的数量 一定要和 plc中存在的数量一一对应
* BoolArray ===> boolean[] booleanArray = new boolean[2]; .... 赋予值
* ByteArray ===> byte[] write_byteArrays = new byte[2];
* WordArray ===> short[] shortArrays_content = new short[2];
* DWordArray ===> int[] intArrays_content = new int[2];
* CharArray ===> char[] charArrays_content = new char[2];
* SIntArray ===> int[] sintArrays_content = new int[2];
* IntArray ===> int[] iintArrays_content = new int[2];
* DIntArray ===> int[] dintArrays_content = new int[2];
* UIntArray ===> int[] uintArrays_content = new int[3];
* USIntArray ===> int[] usintArrays_content = new int[3];
* UDIntArray ===> int[] udintArrays_content = new int[3];
* StringArray ===> String[] stringArrays_content = new String[3];
* //如果有其他数据类型 这里没有找我扩展
*
*
* */
public void write(PlcVarActual plcVarActual,Object newValue,S7Client s7Client){
S7Connector connector = s7Client.getConnector();

//String 类型比较特殊。 String[] 也是同理,Sring数组里面的子项 也是有两个字节的 readBytes。
if(plcVarActual.getType().equals(PlcVar.STRING)){
connector.write(
plcVarActual.getArea(),
plcVarActual.getAreaNumber(),
plcVarActual.getByteOffset(),
plcVarActual.getBitOffset(),
ByteUtils.strToBytes(newValue.toString(), plcVarActual.getStrSize()),
plcVarActual.getType()
);
}else if(plcVarActual.getType().equals(PlcVar.STRING_Array)){
//todo here 检查 read write service
connector.write(
plcVarActual.getArea(),
plcVarActual.getAreaNumber(),
plcVarActual.getByteOffset(),
plcVarActual.getBitOffset(),
ByteUtils.strArrayToBytes((String[])newValue, plcVarActual.getStrSize()),
plcVarActual.getType()
);
}else {
byte[] bytes = plcVarActual.getType().toBytes(newValue);
connector.write(
plcVarActual.getArea(),
plcVarActual.getAreaNumber(),
plcVarActual.getByteOffset(),
plcVarActual.getBitOffset(),
bytes,
plcVarActual.getType()
);
}
}
public void write(DaveArea area, Integer areaNumber, Integer byteOffset, Integer bitOffset,Integer strSize, PlcVar type, Object newValue, S7Client s7Client){
S7Connector connector = s7Client.getConnector();

//String 类型比较特殊。 String[] 也是同理,Sring数组里面的子项 也是有两个字节的 readBytes。
if(type.equals(PlcVar.STRING)){
connector.write(
area,
areaNumber,
byteOffset,
bitOffset,
ByteUtils.strToBytes(newValue.toString(), strSize),
type
);
}else if(type.equals(PlcVar.STRING_Array)){
//todo here 检查 read write service
connector.write(
area,
areaNumber,
byteOffset,
bitOffset,
ByteUtils.strArrayToBytes((String[])newValue, strSize),
type
);
}else {
byte[] bytes = type.toBytes(newValue);
connector.write(
area,
areaNumber,
byteOffset,
bitOffset,
bytes,
type
);
}
}

}

Chargement…
Annuler
Enregistrer