diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e90f1d0e..767c61ab 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -33,6 +33,9 @@ tools:ignore="GoogleAppIndexingWarning" tools:node="merge" tools:replace="android:icon"> + diff --git a/app/src/main/java/com/bonait/bnframework/business/ConfigData.java b/app/src/main/java/com/bonait/bnframework/business/ConfigData.java index 6564b79d..755c079b 100644 --- a/app/src/main/java/com/bonait/bnframework/business/ConfigData.java +++ b/app/src/main/java/com/bonait/bnframework/business/ConfigData.java @@ -30,6 +30,7 @@ import com.bonait.bnframework.common.http.callback.json.JsonDialogCallback; import com.bonait.bnframework.common.image.utils.LocalCacheUtils; import com.bonait.bnframework.common.message.MessageManager; import com.bonait.bnframework.common.modbus.ModbusTcpHelper; +import com.bonait.bnframework.common.modbus.ModbusTcpMainHelper; import com.bonait.bnframework.common.modbus.ModbusTcpServer; import com.bonait.bnframework.common.model.ResAPI; import com.bonait.bnframework.common.model.mode.ActionJsonMode; @@ -155,11 +156,21 @@ public class ConfigData { BPA_SYSTEMSET find_99 = null; BPA_SYSTEMSET find_100 = null; + BPA_SYSTEMSET find_200 = null; + BPA_SYSTEMSET find_201 = null; + BPA_SYSTEMSET find_202 = null; + for (BPA_SYSTEMSET item : bpa_systemsets) { if (item.type == -99) { find_99 = item; } else if (item.type == -100) { find_100 = item; + }else if (item.type == -200) { + find_200 = item; + }else if (item.type == -201) { + find_201 = item; + }else if (item.type == -202) { + find_202 = item; } } if (find_99 == null) { @@ -179,6 +190,34 @@ public class ConfigData { QueryDB.AddSystemset(set); } + if (find_200 == null) { + BPA_SYSTEMSET set = new BPA_SYSTEMSET(); + set.type = -200; + set.value = ConfigName.getInstance().MainAddress; + set.deviceID = ConfigName.getInstance().DeviceId; + set.userID = ConfigName.getInstance().user.userID; + QueryDB.AddSystemset(set); + } + + if (find_201 == null) { + BPA_SYSTEMSET set = new BPA_SYSTEMSET(); + set.type = -201; + set.value = String.valueOf(ConfigName.getInstance().MainPost); + set.deviceID = ConfigName.getInstance().DeviceId; + set.userID = ConfigName.getInstance().user.userID; + QueryDB.AddSystemset(set); + } + + if (find_202 == null) { + BPA_SYSTEMSET set = new BPA_SYSTEMSET(); + set.type = -202; + set.value = String.valueOf(ConfigName.getInstance().DeviceHao); + set.deviceID = ConfigName.getInstance().DeviceId; + set.userID = ConfigName.getInstance().user.userID; + QueryDB.AddSystemset(set); + } + + bpa_systemsets = QueryDB.GetSystemsetALL(); for (BPA_SYSTEMSET item : bpa_systemsets) { switch (item.type) { @@ -188,6 +227,15 @@ public class ConfigData { case -99: ConfigName.getInstance().Environment = item.value; break; + case -200: + ConfigName.getInstance().MainAddress = item.value; + break; + case -201: + ConfigName.getInstance().MainPost = Integer.parseInt(item.value); + break; + case -202: + ConfigName.getInstance().DeviceHao = Integer.parseInt(item.value); + break; case 1: ConfigName.getInstance().Address = item.value; break; @@ -1041,6 +1089,12 @@ public class ConfigData { } else if (ConfigName.getInstance().versionSelectionEnum.equals("小炒版本")) { plcaddresses = ConfigName.getInstance().PlcAddress_小炒; processTS = ConfigName.getInstance().Process_小炒; + } else if (ConfigName.getInstance().versionSelectionEnum.equals("一拖四大炒")) { + plcaddresses = ConfigName.getInstance().PlcAddress_一拖四; + processTS = ConfigName.getInstance().Process_一拖四; + } else if (ConfigName.getInstance().versionSelectionEnum.equals("一拖二大炒")) { + plcaddresses = ConfigName.getInstance().PlcAddress_大炒自动投料; + processTS = ConfigName.getInstance().Process_一拖四; } //region 恢复PLC @@ -1100,29 +1154,18 @@ public class ConfigData { //endregion //region PLC初始化 - - /** - * 连接PLC - */ - public void ConnectPLC() { - new Thread(new Runnable() { - @Override - public void run() { - try { - ModbusTcpServer.get().Connect(); - } catch (Exception e) { - - } - } - }).start(); - } - /** * 关闭PLC */ public void ColsePLC() { ModbusTcpHelper.get().release();//释放modbus ConfigName.getInstance().PlcIsConnect = false; + + if(ConfigName.getInstance().versionSelectionEnum.contains("一拖")) + { + ModbusTcpMainHelper.get().release();//释放modbus + ConfigName.getInstance().PlcMainIsConnect = false; + } } /** @@ -1132,6 +1175,14 @@ public class ConfigData { //PLC连接成功,启动数据监听 ExecuteTheRecipe.Listening(); } + + /** + * PLC主控初始化完成时,需要注册的服务 + */ + public void MainPLC_Init() { + //PLC连接成功,启动数据监听 + ExecuteTheRecipe.MainListening(); + } //endregion } diff --git a/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java b/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java index fd05b3c5..b474e464 100644 --- a/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java +++ b/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java @@ -6,11 +6,15 @@ import android.content.ContextWrapper; import android.os.Handler; import android.os.Looper; import android.util.Log; +import android.view.View; import androidx.annotation.NonNull; import com.bonait.bnframework.common.constant.ConfigName; +import com.bonait.bnframework.common.constant.DataBus; +import com.bonait.bnframework.common.constant.MessageName; import com.bonait.bnframework.common.db.QueryDB; +import com.bonait.bnframework.common.db.mode.BPA_GOODS; import com.bonait.bnframework.common.db.mode.BPA_GOODSRECIPE; import com.bonait.bnframework.common.db.mode.BPA_MATERIAL; import com.bonait.bnframework.common.db.mode.BPA_PLCADDRESS; @@ -21,6 +25,8 @@ import com.bonait.bnframework.common.helper.I.IRunT; import com.bonait.bnframework.common.helper.I.IThread; import com.bonait.bnframework.common.helper.I.IWriteCallBack; import com.bonait.bnframework.common.helper.ThreadManager; +import com.bonait.bnframework.common.message.MessageManager; +import com.bonait.bnframework.common.modbus.ModbusTcpMainServer; import com.bonait.bnframework.common.modbus.ModbusTcpServer; import com.bonait.bnframework.common.utils.AlertDialogUtils; import com.bonait.bnframework.common.utils.ToastUtils; @@ -50,7 +56,7 @@ public class ExecuteTheRecipe { * 等待超时时间 */ //public static int whileTime = 40; - public static int whileTime = 40; + public static int whileTime = 5; /** * 监听变量值 @@ -279,7 +285,16 @@ public class ExecuteTheRecipe { Write_PLC_Heating(formulation); break; case "主料": - Write_PLC_Ingredients(formulation); + if (ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { + Write_PLC_MainIngredients(formulation); + } else { + Write_PLC_Ingredients(formulation); + } + break; + case "辅料": + if (ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { + Write_PLC_MainAccessory(formulation); + } break; case "加水": Write_PLC_Water(formulation); @@ -288,14 +303,16 @@ public class ExecuteTheRecipe { Write_PLC_Delay(formulation); break; case "出菜": - Write_PLC_Outdishes(formulation); + if (ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { + Write_PLC_MainOutdishes(formulation); + } else { + Write_PLC_Outdishes(formulation); + } break; case "清洗": Write_PLC_CleanPan(formulation); break; } - - } } } catch (Exception ex) { @@ -416,7 +433,7 @@ public class ExecuteTheRecipe { } else if (key.contains("速度")) { int writeValue = GetMXValue(key, value); //修改最高速度40 - WritePLC(key, writeValue>=30?30:writeValue, null); + WritePLC(key, writeValue >= 30 ? 30 : writeValue, null); } } @@ -656,6 +673,7 @@ public class ExecuteTheRecipe { /** * 组断执行 + * * @param name */ public static void BottomClick1(String name) { @@ -801,13 +819,14 @@ public class ExecuteTheRecipe { ToastUtils.info("工序:" + key + "," + value); if (key.contains("(秒)")) { int val = Integer.parseInt(value); - if(all_list.size()>0) - { + if (all_list.size() > 0) { Thread.sleep(val * 1000); } } } + ExecuteTheRecipe.WritePLC("搅拌", false, null); + ExecuteTheRecipe.WritePLC("加热", false, null); BottomClick1("出菜"); //一直等待机器移动到该位置,否则就一直等待 6s超时 @@ -815,7 +834,7 @@ public class ExecuteTheRecipe { final boolean[] IsComplete = {false}; long a = System.currentTimeMillis(); while (!IsComplete[0]) { - if ((System.currentTimeMillis() - a) > 1000 * (whileTime*3)) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { break; } else { Object sb = ReadPLC(name);//ListeningValue.get(name); @@ -858,7 +877,7 @@ public class ExecuteTheRecipe { final boolean[] IsComplete = {false}; long a = System.currentTimeMillis(); while (!IsComplete[0]) { - if ((System.currentTimeMillis() - a) > 1000 * (whileTime*5)) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 5)) { break; } else { Object sb = ReadPLC(name);//ListeningValue.get(name); @@ -876,6 +895,266 @@ public class ExecuteTheRecipe { } //endregion + //region 一拖四写PLC工序 + + /** + * 写PLC主料 + * + * @param data + */ + private static void Write_PLC_MainIngredients(HashMap data) { + try { + //是否手动 + boolean ishand = true; + ToastUtils.info("准备倒入主料!"); + + //region 判断是否手动 + if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本")) { + ishand = true; + } else { + for (HashMap.Entry entry : data.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key.contains("投料动作")) { + if (value.contains("手动投料")) { + ishand = true; + } else { + ishand = false; + } + } + } + } + //endregion + + + if (ishand) { + String name = ""; + String zl = ""; + int val = 0; + for (HashMap.Entry entry : data.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key.contains("名称")) { + name = value; + } else if (key.contains("重量")) { + zl = value; + } + } + ToastUtils.info("工序:手动投料," + name + "," + zl); + String title = "手动投料-温馨提示!"; + String message = "客官请投入主料,[" + name + "]重量" + zl + "g,投入后点击[确定]继续流程!"; + ExecuteTheRecipe.WritePLC("暂停开关", true, null); + + final boolean[] IsComplete = {false}; + Activity activity = findActivity(context); + if (activity != null) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + try { + + new QMUIDialog.MessageDialogBuilder(context) + .setCancelable(false) + .setTitle(title) + .setMessage(message) + .addAction("确定", new QMUIDialogAction.ActionListener() { + @Override + public void onClick(QMUIDialog dialog, int index) { + IsComplete[0] = true; + dialog.dismiss(); + } + }) + .create(com.qmuiteam.qmui.R.style.QMUI_Dialog).show(); + + } catch (Exception e) { + + } + } + }); + } + + while (!IsComplete[0]) { + Thread.sleep(100);//10 *6 + } + ExecuteTheRecipe.WritePLC("暂停开关", false, null); + ToastUtils.info("确定完成,继续制作!"); + } else { + //自动投料 + String writeValue = "1号位"; + for (HashMap.Entry entry : data.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key.contains("主料位置")) { + if (!value.contains("3") && !value.contains("4")) { + writeValue = value; + } + } + } + if (ExecuteCurrentOperation != null) { + ExecuteCurrentOperation.Run("主料" + "|" + writeValue); + } + + //2.给倒菜启动 + BottomClick1("主料" + writeValue); + String name = writeValue + "倒菜完成"; + final boolean[] IsComplete = {false}; + long a = System.currentTimeMillis(); + while (!IsComplete[0]) { + if ((System.currentTimeMillis() - a) > 1000 * whileTime) { + break; + } else { + Object sb = ReadPLC(name);// ListeningValue.get(name); + if (sb != null) { + IsComplete[0] = (boolean) (sb); + } + } + Thread.sleep(100);//10 *6 + } + ToastUtils.info("主料倒入完成,继续制作!"); + } + Log.d("倒菜", "倒菜完成了"); + + if (IsMoveYiHaoWei()) { + WriteMainPLC("机器人放主料完成", true, null); + } + + //判断是否有烹饪时间 + int val = 0; + for (HashMap.Entry entry : data.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key.contains("(秒)")) { + val = Integer.parseInt(value); + } + } + if (val > 0) { + Thread.sleep(val * 1000); + } + + Log.d("烹饪时间", "烹饪时间完成了"); + + + } catch (Exception ex) { + ToastUtils.error("异常信息:" + ex.getMessage()); + } + } + + /** + * 写PLC投辅料 + * + * @param data + */ + private static void Write_PLC_MainAccessory(HashMap data) { + try { + int val = 0; + for (HashMap.Entry entry : data.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + if (key.contains("(秒)")) { + val = Integer.parseInt(value); + } + } + + if (ExecuteCurrentOperation != null) { + ExecuteCurrentOperation.Run("辅料" + "|" + val); + } + WriteMainPLC("机器人放辅料完成", false, null); + WriteMainPLC("炒锅请求投辅料", true, null); + final boolean[] IsComplete = {false}; + long a = System.currentTimeMillis(); + while (!IsComplete[0]) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { + break; + } else { + Object sb = ReadMainPLC("机器人放辅料完成");//ListeningValue.get(name); + if (sb != null) { + IsComplete[0] = (boolean) (sb); + } + } + Thread.sleep(100);//10 *6 + } + WriteMainPLC("机器人放辅料完成", false, null); + + if (val > 0) { + Thread.sleep(val * 1000); + } + } catch (Exception ex) { + ToastUtils.error("异常信息:" + ex.getMessage()); + } + } + + /** + * 写PLC 出菜 + * + * @param data + */ + private static void Write_PLC_MainOutdishes(HashMap data) { + try { + ToastUtils.info("准备出菜!"); + //先延迟 + for (HashMap.Entry entry : data.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + ToastUtils.info("工序:" + key + "," + value); + if (key.contains("(秒)")) { + int val = Integer.parseInt(value); + if (all_list.size() > 0) { + Thread.sleep(val * 1000); + } + } + } + ExecuteTheRecipe.WritePLC("搅拌", false, null); + ExecuteTheRecipe.WritePLC("加热", false, null); + + WriteMainPLC("炒锅出餐完成", false, null); + WriteMainPLC("机器人到达炒锅出餐位", false, null); + WriteMainPLC("炒菜完成请求出餐", true, null); + //等待机器人就位 + final boolean[] IsComplete = {false}; + long a = System.currentTimeMillis(); + while (!IsComplete[0]) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { + break; + } else { + Object sb = ReadMainPLC("机器人到达炒锅出餐位");//ListeningValue.get(name); + if (sb != null) { + IsComplete[0] = (boolean) (sb); + } + } + Thread.sleep(100);//10 *6 + } + WriteMainPLC("机器人到达炒锅出餐位", false, null); + WriteMainPLC("炒锅倒菜减速位", false, null); + + BottomClick1("出菜"); + + //一直等待机器移动到该位置,否则就一直等待 6s超时 + String name = "出餐启动反馈"; + IsComplete[0] = false; + a = System.currentTimeMillis(); + while (!IsComplete[0]) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { + break; + } else { + Object sb = ReadPLC(name);//ListeningValue.get(name); + if (sb != null) { + IsComplete[0] = (boolean) (sb); + } + Object jsw = ReadPLC("炒锅倒菜减速位");//ListeningValue.get(name); + if (jsw != null) { + WriteMainPLC("炒锅出餐减速到位", (Boolean) jsw, null); + } + } + Thread.sleep(100);//10 *6 + } + WriteMainPLC("炒锅出餐完成", true, null); + ToastUtils.info("出菜完成,锅体准备回到原位!"); + } catch (Exception ex) { + ToastUtils.error("异常信息:" + ex.getMessage()); + } + } + //endregion + //region 判断当前工序后是否还有 主料 不包含 手动配料 /** @@ -900,7 +1179,7 @@ public class ExecuteTheRecipe { } - if (kkkkkk.size() <= 0 && all_list.size()>0) { + if (kkkkkk.size() <= 0 && all_list.size() > 0) { IsMove = true; } @@ -964,6 +1243,10 @@ public class ExecuteTheRecipe { //endregion //region PLC监听线程 + + /** + * 自提设备监听 + */ public static void Listening() { ConfigName.getInstance().PLC_Address.clear(); @@ -1011,6 +1294,7 @@ public class ExecuteTheRecipe { if (ConfigName.getInstance().PlcIsConnect) { TempControl(); ReadPLCStatus(); + ReadPLCMainStatus(); } } catch (Exception ex) { @@ -1031,7 +1315,7 @@ public class ExecuteTheRecipe { try { if (ConfigName.getInstance().PlcIsConnect) { //心跳 - WritePLC("心跳位",0,null); + WritePLC("心跳位", 0, null); Log.e("心跳", "心跳: "); //Log.e("心跳", "心跳: "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } @@ -1048,6 +1332,48 @@ public class ExecuteTheRecipe { } }); } + + /** + * 主控设备监听 + */ + public static void MainListening() { + new Thread(new Runnable() { + @Override + public void run() { + for (String item : ConfigName.getInstance().MainPlcAddress.keySet()) { + if (!item.equals("商品信息")) { + WriteMainPLC(item, false, null); + } + } + } + }).start(); + + ThreadManager.Get().StartLong("主控PLC设备-心跳", true, new IThread() { + @Override + public void Run() throws InterruptedException { + try { + if (ConfigName.getInstance().PlcMainIsConnect) { + //心跳 + WriteMainPLC("心跳", false, null); + WriteMainPLC("炒锅空闲状态", ConfigName.getInstance().WokStatus, null); + WriteMainPLC("投料机构状态", ConfigName.getInstance().TouLiaoStatus, null); + + //读取主控下发的商品 + ReadMasterDeliveryGoods(); + } + + } catch (Exception ex) { + ToastUtils.error("异常信息:" + ex.getMessage()); + } + Thread.sleep(2000); + } + + @Override + public void RunComplete() throws InterruptedException { + + } + }); + } //endregion //region PLC基础控制类 @@ -1096,7 +1422,6 @@ public class ExecuteTheRecipe { if (!plcaddress.address.isEmpty() && ConfigName.getInstance().PlcIsConnect) { if (plcaddress.address.toUpperCase().startsWith("VD"))//int { - ModbusTcpServer.get().ReadInt(plcaddress.address, 1, ints -> { ReturnsVariable[0] = ints[0]; }); @@ -1120,6 +1445,59 @@ public class ExecuteTheRecipe { } } + /** + * 写主控PLC数据 + * + * @param name + * @param value + */ + public static void WriteMainPLC(String name, boolean value, IWriteCallBack callback) { + try { + if (ConfigName.getInstance().MainPlcAddress.containsKey(name)) { + Integer plcaddress = ConfigName.getInstance().MainPlcAddress.get(name) + (ConfigName.getInstance().DeviceHao - 1) * 100; + if (ConfigName.getInstance().PlcMainIsConnect) { + ModbusTcpMainServer.get().WriteBool(String.valueOf(plcaddress), value, callback); + } + } + } catch (Exception ex) { + ToastUtils.error("异常信息:" + ex.getMessage()); + } finally { + } + } + + /** + * 读主控PLC数据 + * + * @param name + * @return + */ + public static Object ReadMainPLC(String name) { + final Object[] ReturnsVariable = {null}; + try { + if (ConfigName.getInstance().MainPlcAddress.containsKey(name)) { + if (!name.equals("商品信息")) { + Integer plcaddress = ConfigName.getInstance().MainPlcAddress.get(name) + (ConfigName.getInstance().DeviceHao - 1) * 100; + if (ConfigName.getInstance().PlcMainIsConnect) { + ModbusTcpMainServer.get().ReadBool(String.valueOf(plcaddress), 1, val -> { + ReturnsVariable[0] = val[0]; + }); + } + } else { + Integer plcaddress = ConfigName.getInstance().MainPlcAddress.get(name) + (ConfigName.getInstance().DeviceHao - 1) * 20; + if (ConfigName.getInstance().PlcMainIsConnect) { + ModbusTcpMainServer.get().ReadString(String.valueOf(plcaddress), 36, val1 -> { + ReturnsVariable[0] = val1; + }); + } + } + } + } catch (Exception ex) { + ToastUtils.error("异常信息:" + ex.getMessage()); + } finally { + return ReturnsVariable[0]; + } + } + /** * 实时状态 */ @@ -1195,13 +1573,35 @@ public class ExecuteTheRecipe { } } + /** + * 反馈主控制台状态 + */ + public static void ReadPLCMainStatus() { + try { + if (ConfigName.getInstance().PlcIsConnect) { + Object obj1 = getListingValue("翻转轴1允许机器人放盒取盒"); + Object obj2 = getListingValue("翻转轴2允许机器人放盒取盒"); + boolean ob1 = obj1 == null ? false : (boolean) obj1; + boolean ob2 = obj2 == null ? false : (boolean) obj2; + ConfigName.getInstance().TouLiaoStatus = ob1 && ob2; + + Object obj3 = getListingValue("初始化"); + boolean ob3 = obj3 == null ? false : (boolean) obj3; + ConfigName.getInstance().WokStatus = ob3 && !ExecuteTheRecipe.IsStart; + } + } catch (Exception ex) { + ToastUtils.error("异常信息:" + ex.getMessage()); + } finally { + } + } + /** * 温控 */ public static void TempControl() { boolean TempBool = false; Object val_wd = ExecuteTheRecipe.getListingValue("当前锅底温度"); - int dq_wd =val_wd==null?0: (int) val_wd;//当前锅底温度 + int dq_wd = val_wd == null ? 0 : (int) val_wd;//当前锅底温度 if (dq_wd >= (ConfigName.getInstance().MaxTemp - 5)) //如果当前温度大于最大温度限制 断开 { TempBool = true;//设置断开 @@ -1226,6 +1626,84 @@ public class ExecuteTheRecipe { } } } + + /** + * 读取主控下发的商品 + */ + public static void ReadMasterDeliveryGoods() { + Object Ismake = ReadMainPLC("商品下发"); + if (Ismake != null) { + if ((boolean) Ismake) //信息来了,是否需要制作 + { + WriteMainPLC("商品下发", false, null); + Object obj = ReadMainPLC("商品信息"); + String id = obj == null ? "--------" : (String) obj; + + BPA_GOODS goods = QueryDB.GetGoodsId(id); + if (goods == null) { + WriteMainPLC("商品数据验证", false, null); + } else { +// Object chushiover = ExecuteTheRecipe.getListingValue("初始化完成"); +// if (!ConfigName.getInstance().PlcIsConnect) { +// ToastUtils.warning("PLC未准备就绪!!!"); +// WriteMainPLC("商品数据验证", false, null); +// }else if (chushiover == null || !(boolean) chushiover) { +// ToastUtils.warning("设备未初始化,请先手动初始化设备!!!"); +// WriteMainPLC("商品数据验证", false, null); +// }else + if (ExecuteTheRecipe.IsStart) { + ToastUtils.warning("请耐心等待商品制作结束!!!"); + WriteMainPLC("商品数据验证", false, null); + } else { + if (ConfigName.getInstance().user.name.equals("admin") || ConfigName.getInstance().user.account.equals("admin") || ConfigName.getInstance().user.userID.equals("超级管理员")) { + DataBus.getInstance().mListener.clickListener(null, goods); + try { + final boolean[] IsComplete = {false}; + long a = System.currentTimeMillis(); + while (!IsComplete[0]) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { + break; + } else { + Object sb = ReadMainPLC("机器人放主料完成"); + if (sb != null) { + IsComplete[0] = (boolean) (sb); + } + } + Thread.sleep(100);//10 *6 + } + WriteMainPLC("机器人放主料完成", false, null); + } catch (Exception e) { + + } + MessageManager.getInstance().sendMessage(MessageName.IsStratMakeGood1, goods.id); + + } else { + MessageManager.getInstance().sendMessage(MessageName.OpenMakeGoodFrom, goods.id); + try { + final boolean[] IsComplete = {false}; + long a = System.currentTimeMillis(); + while (!IsComplete[0]) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { + break; + } else { + Object sb = ReadMainPLC("机器人放主料完成"); + if (sb != null) { + IsComplete[0] = (boolean) (sb); + } + } + Thread.sleep(100);//10 *6 + } + WriteMainPLC("机器人放主料完成", false, null); + } catch (Exception e) { + + } + MessageManager.getInstance().sendMessage(MessageName.IsStratMakeGood, goods.id); + } + } + } + } + } + } //endregion //region 获取基础挡位变量 diff --git a/app/src/main/java/com/bonait/bnframework/common/constant/ConfigName.java b/app/src/main/java/com/bonait/bnframework/common/constant/ConfigName.java index 3a6dd6e2..eafd4f86 100644 --- a/app/src/main/java/com/bonait/bnframework/common/constant/ConfigName.java +++ b/app/src/main/java/com/bonait/bnframework/common/constant/ConfigName.java @@ -197,6 +197,39 @@ public class ConfigName { * Plc端口 */ public int Post = 502; + + + /** + * 主控 Plc是否连接 + */ + public boolean PlcMainIsConnect = false; + + /** + * 主控PLC地址 + */ + public String MainAddress = "192.168.4.100"; + /** + * 主控 Plc端口 + */ + public int MainPost = 30000; + + /** + * 一拖四设备号 + */ + public int DeviceHao = 1; + + /** + * 炒锅状态:空闲 或者 不正常 + */ + public boolean WokStatus = true; + /** + * 炒锅投料机构:空闲 或者 不正常 + */ + public boolean TouLiaoStatus = true; + /** + * 出餐减速位:空闲 或者 不正常 + */ + public boolean ChuCaiJainShuStatus = false; //endregion //region URL @@ -828,6 +861,285 @@ public class ConfigName { }}; + /** + * 一拖四基础PLC模型 + */ + public List PlcAddress_一拖四 = new ArrayList() {{ + + //硬件设备 初始化 + add(new Res_PLCADDRESS("硬件设备", "-------------", 0, 0)); + add(new Res_PLCADDRESS("初始化", "M10.0", 1, 1)); + add(new Res_PLCADDRESS("停止", "M10.1", 1, 1)); + add(new Res_PLCADDRESS("复位", "M10.2", 0, 1)); + + //搅拌模型 + add(new Res_PLCADDRESS("模型控制", "-------------", 0, 0)); + add(new Res_PLCADDRESS("搅拌", "M10.3", 0, 1)); + add(new Res_PLCADDRESS("搅拌速度", "VW102", 1, 1)); + + //翻转正转模型 + add(new Res_PLCADDRESS("翻转正转", "M10.4", 0, 1)); + add(new Res_PLCADDRESS("翻转反转", "M10.5", 0, 1)); + add(new Res_PLCADDRESS("转动速度", "VW104", 1, 1)); + + + //加热模型 + add(new Res_PLCADDRESS("加热", "M10.6", 0, 1)); + add(new Res_PLCADDRESS("加热功率", "VW100", 1, 1)); + add(new Res_PLCADDRESS("温控开关", "M17.6", 1, 1)); + add(new Res_PLCADDRESS("暂停开关", "M17.7", 1, 1)); + + //主料 + add(new Res_PLCADDRESS("主料1号位", "M17.4", 0, 1)); + add(new Res_PLCADDRESS("主料2号位", "M19.4", 0, 1)); + + //抽水放水 + add(new Res_PLCADDRESS("炒锅抽水", "M10.7", 0, 1)); + add(new Res_PLCADDRESS("炒锅放水", "M11.0", 0, 1)); + + + //出菜模型 + add(new Res_PLCADDRESS("出菜", "M11.5", 0, 1)); + + + //位置动作 + add(new Res_PLCADDRESS("原点位", "M11.4", 0, 1)); + add(new Res_PLCADDRESS("倒菜位", "M12.7", 0, 1)); + add(new Res_PLCADDRESS("抽料位", "M11.7", 0, 1)); + add(new Res_PLCADDRESS("清洗位", "M13.0", 0, 1)); + add(new Res_PLCADDRESS("炒菜位1", "M12.0", 0, 1)); + add(new Res_PLCADDRESS("炒菜位2", "M12.1", 0, 1)); + add(new Res_PLCADDRESS("炒菜位3", "M12.2", 0, 1)); + + add(new Res_PLCADDRESS("出餐启动", "M11.5", 0, 1)); + add(new Res_PLCADDRESS("炒锅清洗", "M11.6", 0, 1)); + + //液体料模型 + add(new Res_PLCADDRESS("料仓校准", "-------------", 0, 0)); + add(new Res_PLCADDRESS("校准时间", "VW112", 1, 1)); + add(new Res_PLCADDRESS("料仓1校准开关", "M12.3", 0, 1)); + add(new Res_PLCADDRESS("料仓1校准值", "VW114", 1, 1)); + add(new Res_PLCADDRESS("料仓2校准开关", "M12.4", 0, 1)); + add(new Res_PLCADDRESS("料仓2校准值", "VW116", 1, 1)); + add(new Res_PLCADDRESS("料仓3校准开关", "M12.5", 0, 1)); + add(new Res_PLCADDRESS("料仓3校准值", "VW118", 1, 1)); + add(new Res_PLCADDRESS("料仓4校准开关", "M13.5", 0, 1)); + add(new Res_PLCADDRESS("料仓4校准值", "VW120", 1, 1)); + add(new Res_PLCADDRESS("开始校正", "M12.6", 0, 1)); + + add(new Res_PLCADDRESS("料仓自动", "-------------", 0, 0)); + add(new Res_PLCADDRESS("料仓1需求值", "VW106", 1, 1)); + add(new Res_PLCADDRESS("料仓1下料", "M11.1", 0, 1)); + add(new Res_PLCADDRESS("料仓2需求值", "VW108", 1, 1)); + add(new Res_PLCADDRESS("料仓2下料", "M11.2", 0, 1)); + add(new Res_PLCADDRESS("料仓3需求值", "VW110", 1, 1)); + add(new Res_PLCADDRESS("料仓3下料", "M11.3", 0, 1)); + add(new Res_PLCADDRESS("料仓4需求值", "VW122", 1, 1)); + add(new Res_PLCADDRESS("料仓4下料", "M13.4", 0, 1)); + + add(new Res_PLCADDRESS("料仓手动", "-------------", 0, 0)); + add(new Res_PLCADDRESS("料仓1手动开关", "M13.1", 1, 1)); + add(new Res_PLCADDRESS("料仓2手动开关", "M13.2", 1, 1)); + add(new Res_PLCADDRESS("料仓3手动开关", "M13.3", 1, 1)); + add(new Res_PLCADDRESS("料仓4手动开关", "M10.7", 1, 1)); + + //上下限 + add(new Res_PLCADDRESS("位置上下限", "-------------", 0, 0)); + add(new Res_PLCADDRESS("原点位置下限", "VD150", 1, 1)); + add(new Res_PLCADDRESS("原点位置上限", "VD154", 1, 1)); + add(new Res_PLCADDRESS("洗锅位置下限", "VD158", 1, 1)); + add(new Res_PLCADDRESS("洗锅位置上限", "VD162", 1, 1)); + add(new Res_PLCADDRESS("倒菜位置下限", "VD166", 1, 1)); + add(new Res_PLCADDRESS("倒菜位置上限", "VD170", 1, 1)); + add(new Res_PLCADDRESS("抽调料位置下限", "VD174", 1, 1)); + add(new Res_PLCADDRESS("抽调料位置上限", "VD178", 1, 1)); + add(new Res_PLCADDRESS("1#炒制位置下限", "VD182", 1, 1)); + add(new Res_PLCADDRESS("1#炒制位置上限", "VD186", 1, 1)); + add(new Res_PLCADDRESS("2#炒制位置下限", "VD190", 1, 1)); + add(new Res_PLCADDRESS("2#炒制位置上限", "VD194", 1, 1)); + add(new Res_PLCADDRESS("3#炒制位置下限", "VD198", 1, 1)); + add(new Res_PLCADDRESS("3#炒制位置上限", "VD202", 1, 1)); + add(new Res_PLCADDRESS("炒锅工作范围下限", "VD206", 1, 1)); + add(new Res_PLCADDRESS("炒锅工作范围上限", "VD210", 1, 1)); + + //自动投料-平移轴 +// add(new Res_PLCADDRESS("平移轴控制", "-------------", 0, 0)); +// add(new Res_PLCADDRESS("平移-伺服当前值", "VD220", 1, 1)); +// add(new Res_PLCADDRESS("平移-点动速度", "VD224", 1, 1)); +// add(new Res_PLCADDRESS("平移-回原点速度", "VD228", 1, 1)); +// add(new Res_PLCADDRESS("平移-定位运行速度", "VD232", 1, 1)); +// +// add(new Res_PLCADDRESS("平移-点动正转", "M14.0", 0, 1)); +// add(new Res_PLCADDRESS("平移-点动反转", "M14.1", 0, 1)); +// add(new Res_PLCADDRESS("平移-回原点", "M14.2", 0, 1)); +// add(new Res_PLCADDRESS("平移-去1号位", "M14.3", 0, 1)); +// add(new Res_PLCADDRESS("平移-去2号位", "M14.4", 0, 1)); +// add(new Res_PLCADDRESS("平移-去3号位", "M14.5", 0, 1)); +// add(new Res_PLCADDRESS("平移-去4号位", "M14.6", 0, 1)); +// +// add(new Res_PLCADDRESS("平移-1号位置值", "VD236", 1, 1)); +// add(new Res_PLCADDRESS("平移-1#位置设定", "M15.0", 0, 1)); +// add(new Res_PLCADDRESS("平移-2号位置值", "VD240", 1, 1)); +// add(new Res_PLCADDRESS("平移-2#位置设定", "M15.1", 0, 1)); +// add(new Res_PLCADDRESS("平移-3号位置值", "VD244", 1, 1)); +// add(new Res_PLCADDRESS("平移-3#位置设定", "M15.2", 0, 1)); +// add(new Res_PLCADDRESS("平移-4号位置值", "VD248", 1, 1)); +// add(new Res_PLCADDRESS("平移-4#位置设定", "M15.3", 0, 1)); + + //自动投料-翻转轴 + add(new Res_PLCADDRESS("翻转轴控制1", "-------------", 0, 0)); + add(new Res_PLCADDRESS("翻转1-伺服当前值", "VD260", 1, 1)); + add(new Res_PLCADDRESS("翻转1-点动速度", "VD264", 1, 1)); + add(new Res_PLCADDRESS("翻转1-回原点速度", "VD268", 1, 1)); + add(new Res_PLCADDRESS("翻转1-定位运行速度", "VD272", 1, 1)); + + add(new Res_PLCADDRESS("翻转1-点动正转", "M16.0", 0, 1)); + add(new Res_PLCADDRESS("翻转1-点动反转", "M16.1", 0, 1)); + add(new Res_PLCADDRESS("翻转1-回原点", "M16.2", 0, 1)); + add(new Res_PLCADDRESS("翻转1-去1号位", "M16.3", 0, 1)); + add(new Res_PLCADDRESS("翻转1-去2号位", "M16.4", 0, 1)); + add(new Res_PLCADDRESS("翻转1-去3号位", "M16.5", 0, 1)); + add(new Res_PLCADDRESS("翻转1-去4号位", "M16.6", 0, 1)); + + add(new Res_PLCADDRESS("翻转1-1号位置值", "VD276", 1, 1)); + add(new Res_PLCADDRESS("翻转1-1#位置设定", "M17.0", 0, 1)); + add(new Res_PLCADDRESS("翻转1-2号位置值", "VD280", 1, 1)); + add(new Res_PLCADDRESS("翻转1-2#位置设定", "M17.1", 0, 1)); + add(new Res_PLCADDRESS("翻转1-3号位置值", "VD284", 1, 1)); + add(new Res_PLCADDRESS("翻转1-3#位置设定", "M17.2", 0, 1)); + add(new Res_PLCADDRESS("翻转1-4号位置值", "VD288", 1, 1)); + add(new Res_PLCADDRESS("翻转1-4#位置设定", "M17.3", 0, 1)); + add(new Res_PLCADDRESS("倒菜启动1", "M17.4", 0, 1)); + + add(new Res_PLCADDRESS("翻转轴控制2", "-------------", 0, 0)); + add(new Res_PLCADDRESS("翻转2-伺服当前值", "VD2000", 1, 1)); + add(new Res_PLCADDRESS("翻转2-点动速度", "VD2004", 1, 1)); + add(new Res_PLCADDRESS("翻转2-回原点速度", "VD2008", 1, 1)); + add(new Res_PLCADDRESS("翻转2-定位运行速度", "VD2012", 1, 1)); + + add(new Res_PLCADDRESS("翻转2-点动正转", "M18.0", 0, 1)); + add(new Res_PLCADDRESS("翻转2-点动反转", "M18.1", 0, 1)); + add(new Res_PLCADDRESS("翻转2-回原点", "M18.2", 0, 1)); + add(new Res_PLCADDRESS("翻转2-去1号位", "M18.3", 0, 1)); + add(new Res_PLCADDRESS("翻转2-去2号位", "M18.4", 0, 1)); + add(new Res_PLCADDRESS("翻转2-去3号位", "M18.5", 0, 1)); + add(new Res_PLCADDRESS("翻转2-去4号位", "M18.6", 0, 1)); + + add(new Res_PLCADDRESS("翻转2-1号位置值", "VD2016", 1, 1)); + add(new Res_PLCADDRESS("翻转2-1#位置设定", "M19.0", 0, 1)); + add(new Res_PLCADDRESS("翻转2-2号位置值", "VD2020", 1, 1)); + add(new Res_PLCADDRESS("翻转2-2#位置设定", "M19.1", 0, 1)); + add(new Res_PLCADDRESS("翻转2-3号位置值", "VD2024", 1, 1)); + add(new Res_PLCADDRESS("翻转2-3#位置设定", "M19.2", 0, 1)); + add(new Res_PLCADDRESS("翻转2-4号位置值", "VD2028", 1, 1)); + add(new Res_PLCADDRESS("翻转2-4#位置设定", "M19.3", 0, 1)); + add(new Res_PLCADDRESS("倒菜启动2", "M19.4", 0, 1)); + + //反馈信号 + add(new Res_PLCADDRESS("反馈信号", "-------------", 0, 0)); + add(new Res_PLCADDRESS("初始化完成", "M40.0", 1, 0)); + add(new Res_PLCADDRESS("设备急停", "M40.1", 1, 0)); + add(new Res_PLCADDRESS("原点位反馈", "M40.2", 1, 0)); + add(new Res_PLCADDRESS("抽料位反馈", "M40.3", 1, 0)); + add(new Res_PLCADDRESS("炒菜位1反馈", "M40.4", 1, 0)); + add(new Res_PLCADDRESS("炒菜位2反馈", "M40.5", 1, 0)); + add(new Res_PLCADDRESS("炒菜位3反馈", "M40.6", 1, 0)); + add(new Res_PLCADDRESS("倒菜位反馈", "M40.7", 1, 0)); + add(new Res_PLCADDRESS("投料位反馈", "M41.0", 1, 0)); + add(new Res_PLCADDRESS("清洗位反馈", "M41.1", 1, 0)); + add(new Res_PLCADDRESS("料仓1下料完成", "M41.2", 1, 0)); + add(new Res_PLCADDRESS("料仓2下料完成", "M41.3", 1, 0)); + add(new Res_PLCADDRESS("料仓3下料完成", "M41.4", 1, 0)); + add(new Res_PLCADDRESS("料仓4下料完成", "M42.0", 1, 0)); + add(new Res_PLCADDRESS("炒锅清洗反馈", "M41.5", 1, 0)); + add(new Res_PLCADDRESS("出餐启动反馈", "M41.6", 1, 0)); + add(new Res_PLCADDRESS("炒锅倒菜减速位", "M41.7", 1, 0)); + add(new Res_PLCADDRESS("平移轴在1号位", "M43.0", 1, 0)); + add(new Res_PLCADDRESS("平移轴在2号位", "M43.1", 1, 0)); + add(new Res_PLCADDRESS("平移轴在3号位", "M43.2", 1, 0)); + add(new Res_PLCADDRESS("平移轴在4号位", "M43.3", 1, 0)); + + add(new Res_PLCADDRESS("翻转轴1在1号位", "M44.0", 1, 0)); + add(new Res_PLCADDRESS("翻转轴1在2号位", "M44.1", 1, 0)); + add(new Res_PLCADDRESS("翻转轴1在3号位", "M44.2", 1, 0)); + add(new Res_PLCADDRESS("翻转轴1在4号位", "M44.3", 1, 0)); + add(new Res_PLCADDRESS("翻转轴1允许机器人放盒取盒", "M44.4", 1, 0)); + add(new Res_PLCADDRESS("1号位倒菜完成", "M44.7", 1, 0)); + + + add(new Res_PLCADDRESS("翻转轴2在1号位", "M45.0", 1, 0)); + add(new Res_PLCADDRESS("翻转轴2在2号位", "M45.1", 1, 0)); + add(new Res_PLCADDRESS("翻转轴2在3号位", "M45.2", 1, 0)); + add(new Res_PLCADDRESS("翻转轴2在4号位", "M45.3", 1, 0)); + add(new Res_PLCADDRESS("翻转轴2允许机器人放盒取盒", "M45.4", 1, 0)); + add(new Res_PLCADDRESS("2号位倒菜完成", "M45.7", 1, 0)); + + add(new Res_PLCADDRESS("心跳位", "VW1000", 0, 1)); + + //检测信号 + add(new Res_PLCADDRESS("监测信号", "-------------", 0, 0)); + add(new Res_PLCADDRESS("当前锅底温度", "VD300", 1, 0)); + add(new Res_PLCADDRESS("炒锅搅拌转速", "VD304", 1, 0)); + add(new Res_PLCADDRESS("当前加热档位", "VD308", 1, 0)); + add(new Res_PLCADDRESS("炒锅当前电压", "VD312", 1, 0)); + add(new Res_PLCADDRESS("炒锅当前电流", "VD316", 1, 0)); + add(new Res_PLCADDRESS("炒锅当前功率", "VD320", 1, 0)); + add(new Res_PLCADDRESS("搅拌频率", "VW324", 1, 0)); + add(new Res_PLCADDRESS("搅拌电机电流", "VW326", 1, 0)); + add(new Res_PLCADDRESS("搅拌电机电压", "VW328", 1, 0)); + add(new Res_PLCADDRESS("搅拌变频器温度", "VW330", 1, 0)); + add(new Res_PLCADDRESS("翻转频率", "VW332", 1, 0)); + add(new Res_PLCADDRESS("翻转电机电流", "VW334", 1, 0)); + add(new Res_PLCADDRESS("翻转电机电压", "VW336", 1, 0)); + add(new Res_PLCADDRESS("翻转变频器温度", "VW338", 1, 0)); + add(new Res_PLCADDRESS("编码器当前位值", "VD340", 1, 0)); + + //状态上报 + add(new Res_PLCADDRESS("状态上报", "-------------", 0, 0)); + add(new Res_PLCADDRESS("搅拌电机", "VW350", 1, 0)); + add(new Res_PLCADDRESS("翻转电机", "VW352", 1, 0)); + add(new Res_PLCADDRESS("炒锅", "VW354", 1, 0)); + + }}; + /** + * 一拖四工序模型 + */ + public List Process_一拖四 = new ArrayList() {{ + add(new ProcessT("搅拌", Arrays.asList("搅拌速度", "延迟(秒)"))); + add(new ProcessT("位置", Arrays.asList("转动速度", "位置动作", "延迟(秒)"))); + add(new ProcessT("加热", Arrays.asList("加热功率", "延迟(秒)"))); + add(new ProcessT("主料", Arrays.asList("主料名称", "主料位置", "主料重量", "投料动作","烹饪(秒)"))); + add(new ProcessT("辅料", Arrays.asList("辅料名称", "烹饪(秒)"))); + add(new ProcessT("液体料", new ArrayList<>())); + add(new ProcessT("延迟", Arrays.asList("延迟(秒)"))); + add(new ProcessT("出菜", Arrays.asList("等待(秒)"))); + add(new ProcessT("清洗", Arrays.asList("等待(秒)"))); + }}; + + /** + * 主控地址列表 + */ + public ConcurrentHashMap MainPlcAddress = new ConcurrentHashMap() {{ + put("炒锅空闲状态",1); //实时 + put("炒锅出餐完成",2); + put("炒锅投主料完成",3); + put("炒锅请求投辅料",4); + put("商品数据验证",5); + put("投料机构状态",6); //实时 + put("心跳",7); //实时 + put("炒菜完成请求出餐",8); + put("炒锅出餐减速到位",9); //实时 + + + put("机器人放主料完成",51); + put("机器人放辅料完成",52); + put("机器人到达炒锅出餐位",53); + put("商品下发",54); + put("商品信息",0); + }}; + + + /** * 根据名称获取变量 * @@ -879,9 +1191,6 @@ public class ConfigName { put("七档", 7); put("八档", 8); }}; - - - public Map HeatingGearL = new LinkedHashMap() {{ put("二档", 0); put("三档", 1); @@ -892,7 +1201,6 @@ public class ConfigName { put("八档", 6); }}; - //region 火力最大级别 /** * 最大火力级别 @@ -1026,7 +1334,7 @@ public class ConfigName { /** * 版本信息 */ - public String[] versionSelectionValues = new String[]{"大炒版本", "大炒自动投料版本", "小炒版本"}; + public String[] versionSelectionValues = new String[]{"大炒版本", "大炒自动投料版本", "小炒版本","一拖四大炒","一拖二大炒"}; /** * 选配版本信息 */ @@ -1039,7 +1347,7 @@ public class ConfigName { add("研发用户"); add("超级管理员"); }}; - //eneregion + //endregion //region 料仓显示物料 /** diff --git a/app/src/main/java/com/bonait/bnframework/common/constant/MessageName.java b/app/src/main/java/com/bonait/bnframework/common/constant/MessageName.java index 37d81e43..bff13913 100644 --- a/app/src/main/java/com/bonait/bnframework/common/constant/MessageName.java +++ b/app/src/main/java/com/bonait/bnframework/common/constant/MessageName.java @@ -29,4 +29,8 @@ public interface MessageName { String OpenMakeGoodFrom="OpenMakeGoodFrom";//打开制作界面 String GoodIsCunZai="GoodIsCunZai"; + + String IsStratMakeGood="IsStratMakeGood";//打开制作界面 + String IsStratMakeGood1="IsStratMakeGood1";//打开制作界面 + } diff --git a/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpMainHelper.java b/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpMainHelper.java new file mode 100644 index 00000000..7cb6fae1 --- /dev/null +++ b/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpMainHelper.java @@ -0,0 +1,43 @@ +package com.bonait.bnframework.common.modbus; + +import com.licheedev.modbus4android.ModbusWorker; +import com.serotonin.modbus4j.ModbusMaster; + +public class ModbusTcpMainHelper extends ModbusWorker { + private static volatile ModbusTcpMainHelper instance = null; + + public static ModbusTcpMainHelper get() { + ModbusTcpMainHelper manager = instance; + if (manager == null) { + synchronized (ModbusTcpMainHelper.class) { + manager = instance; + if (manager == null) { + manager = new ModbusTcpMainHelper(); + instance = manager; + } + } + } + return manager; + } + + private ModbusTcpMainHelper() { + } + + /** + * 释放整个ModbusManager,单例会被置null + */ + public synchronized void release() { + super.release(); + instance = null; + } + + /** + * 获取 + * @return + */ + public synchronized ModbusMaster getModbusMaster() + { + return super.getModbusMaster(); + } + +} diff --git a/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpMainServer.java b/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpMainServer.java new file mode 100644 index 00000000..56146faa --- /dev/null +++ b/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpMainServer.java @@ -0,0 +1,740 @@ +package com.bonait.bnframework.common.modbus; + +import com.bonait.bnframework.business.ConfigData; +import com.bonait.bnframework.common.constant.ConfigName; +import com.bonait.bnframework.common.helper.DataFormat; +import com.bonait.bnframework.common.helper.I.IReadCallBack; +import com.bonait.bnframework.common.helper.I.IWriteCallBack; +import com.bonait.bnframework.common.helper.MessageLog; +import com.bonait.bnframework.common.utils.ToastUtils; +import com.licheedev.modbus4android.ModbusCallback; +import com.licheedev.modbus4android.ModbusParam; +import com.licheedev.modbus4android.ModbusRespException; +import com.licheedev.modbus4android.param.TcpParam; +import com.serotonin.modbus4j.ModbusMaster; +import com.serotonin.modbus4j.exception.ModbusInitException; +import com.serotonin.modbus4j.exception.ModbusTransportException; +import com.serotonin.modbus4j.msg.ReadCoilsResponse; +import com.serotonin.modbus4j.msg.ReadHoldingRegistersResponse; + +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.LineNumberReader; +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.util.Arrays; +import java.util.concurrent.ExecutionException; + +/** + * 主控Tcp服务 + */ +public class ModbusTcpMainServer { + private static volatile ModbusTcpMainServer instance = null; + + public static ModbusTcpMainServer get() { + ModbusTcpMainServer manager = instance; + if (manager == null) { + synchronized (ModbusTcpMainServer.class) { + manager = instance; + if (manager == null) { + manager = new ModbusTcpMainServer(); + instance = manager; + } + } + } + return manager; + } + + private ModbusTcpMainServer() { + } + + static ModbusParam param; + + private int GetAddress(String address) { + if (address == null) return -1; + if (address.length() > 0) { + address = address.trim(); +// if (address.toUpperCase().contains("M") && address.length() >= 4) { +// String[] res = address.substring(1).split("[.]"); +// if (res != null && res.length == 2) { +// try { +// int firstAdd = Integer.parseInt(res[0]); +// int endAdd = Integer.parseInt(res[1]); +// if (endAdd >= 0 && endAdd <= 7) { +// return (firstAdd * 8) + 320 + endAdd; +// } +// } catch (NumberFormatException e) { +// return -1; +// } +// } +// } else if (address.toUpperCase().contains("I") && address.length() >= 4) { +// String[] res = address.substring(1).split("[.]"); +// if (res != null && res.length == 2) { +// try { +// int firstAdd = Integer.parseInt(res[0]); +// int endAdd = Integer.parseInt(res[1]); +// if (endAdd >= 0 && endAdd <= 7) { +// return (firstAdd * 8) + endAdd; +// } +// } catch (NumberFormatException e) { +// return -1; +// } +// } +// } else if ((address.toUpperCase().contains("VW") || address.toUpperCase().contains("VD")) && address.length() >= 3) { +// String res = address.substring(2); +// if (res != null) { +// try { +// int tempAdd = Integer.parseInt(res); +// return (tempAdd / 2) + 100; +// } catch (NumberFormatException e) { +// return -1; +// } +// } +// } else { +// try { +// return Integer.parseInt(address); +// } catch (NumberFormatException e) { +// return -1; +// } +// } + try { + return Integer.parseInt(address); + } catch (NumberFormatException e) { + return -1; + } + } + return -1; + } + + /** + * 获取布尔位地址信息 + * 列:M2.5 = getBitSingleAdd("M",2,5); + * + * @param Prefix 地址标头 + * @param startAdd 起始地址编号 + * @param num 要获取的第几位数量 + * @return + */ + public String getBitSingleAdd(String Prefix, int startAdd, int num) { + if (num > 0) { + int FirstAdd = num / 8; + int EndAdd = num % 8; + if (EndAdd == 0) { + FirstAdd--; + EndAdd = 7; + } else { + EndAdd--; + } + return Prefix + FirstAdd + startAdd + "." + EndAdd; + } + return ""; + } + + /** + * Ping PLC地址是否通畅 + * @param address + * @param pingTimes ping的次数 + * @param timeOut 超时时间 10 + * @return + */ + public static boolean ping2(String address, int pingTimes, int timeOut) { + Process process = null; + try { + process = Runtime.getRuntime().exec( "ping " + "-c " + pingTimes + " -w " + timeOut+ " "+address); + InputStreamReader r = new InputStreamReader(process.getInputStream()); + + LineNumberReader returnData = new LineNumberReader(r); + + String returnMsg=""; + + String line = ""; + + while ((line = returnData.readLine()) != null) { + + System.out.println(line); + + returnMsg += line; + + } + + if(returnMsg.indexOf("100% packet loss")!=-1){ + System.out.println("与 " +address +" 连接不畅通."); + //ToastUtils.info("与 " +address +" 连接不畅通."); + return false; + } else{ + System.out.println("与 " +address +" 连接畅通."); + //ToastUtils.info("与 " +address +" 连接不畅通."); + return true; + } + } catch (IOException e) { + // e.printStackTrace(); + } + return false; + + } + + + /** + * 连接 + */ + public void Connect() throws InterruptedException { + boolean status = false; + while (!status) { + try { + //status为0则代表通,为1则代表不通。 + status =ping2(ConfigName.getInstance().Address,1,1); + Thread.sleep(1000); + } catch (InterruptedException e) { + MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " 网络验证失败"); + } catch (Exception e) { + MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " 网络验证失败"); + } + } + MessageLog.ShowInfo("设备 " + ConfigName.getInstance().Address + " PLC通讯正常,准备连接!"); + + while (ConfigName.getInstance().PlcIsConnect==false) + { + ConnectPLC(); + Thread.sleep(5000); + } + } + + /** + * 连接PLC + */ + public static void ConnectPLC() + { + String host=ConfigName.getInstance().MainAddress; + int port=ConfigName.getInstance().MainPost; + param = TcpParam.create(host, port) + .setTimeout(1000) + .setRetries(0) + .setEncapsulated(false) + .setKeepAlive(true); + ModbusTcpMainHelper.get().init(param, new ModbusCallback() { + @Override + public void onSuccess(ModbusMaster modbusMaster) { + ToastUtils.info("设备 " + ConfigName.getInstance().MainAddress + " 连接成功"); + + MessageLog.ShowInfo("设备 " + ConfigName.getInstance().MainAddress + " 连接成功"); + ConfigName.getInstance().PlcMainIsConnect = true; + ConfigData.getInstance().MainPLC_Init(); + } + + @Override + public void onFailure(Throwable tr) { + ConfigName.getInstance().PlcMainIsConnect = false; + ToastUtils.info("设备 " + ConfigName.getInstance().MainAddress + " 连接失败:" + tr.getMessage()); + MessageLog.ShowError("设备 " + ConfigName.getInstance().MainAddress + " 连接失败:" + tr.getMessage()); + } + @Override + public void onFinally() { + + } + }); + } + + + private Float BytesToFloat(byte[] buffers, DataFormat df) { + if (buffers.length == 4) { + byte[] bytes = new byte[4]; + if (df == DataFormat.ABCD) { + bytes[0] = buffers[3]; + bytes[1] = buffers[2]; + bytes[2] = buffers[1]; + bytes[3] = buffers[0]; + } else if (df == DataFormat.CDAB) { + bytes[0] = buffers[1]; + bytes[1] = buffers[0]; + bytes[2] = buffers[3]; + bytes[3] = buffers[2]; + } else if (df == DataFormat.BADC) { + bytes[0] = buffers[2]; + bytes[1] = buffers[3]; + bytes[2] = buffers[0]; + bytes[3] = buffers[1]; + } else if (df == DataFormat.DCBA) { + bytes[0] = buffers[0]; + bytes[1] = buffers[1]; + bytes[2] = buffers[2]; + bytes[3] = buffers[3]; + } + return ByteBuffer.wrap(bytes).getFloat(); + } + return 0.0f; + } + + private Integer BytesToInt(byte[] buffers, DataFormat df) { + if (buffers.length == 4) { + byte[] bytes = new byte[4]; + if (df == DataFormat.ABCD) { + bytes[0] = buffers[3]; + bytes[1] = buffers[2]; + bytes[2] = buffers[1]; + bytes[3] = buffers[0]; + } else if (df == DataFormat.CDAB) { + bytes[0] = buffers[1]; + bytes[1] = buffers[0]; + bytes[2] = buffers[3]; + bytes[3] = buffers[2]; + } else if (df == DataFormat.BADC) { + bytes[0] = buffers[2]; + bytes[1] = buffers[3]; + bytes[2] = buffers[0]; + bytes[3] = buffers[1]; + } else if (df == DataFormat.DCBA) { + bytes[0] = buffers[0]; + bytes[1] = buffers[1]; + bytes[2] = buffers[2]; + bytes[3] = buffers[3]; + } + return ByteBuffer.wrap(bytes).getInt(); + } + return 0; + } + + private byte[] IntToByte(int number) { + int temp = number; + byte[] b = new byte[4]; + for (int i = 0; i < b.length; i++) { + b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位 + temp = temp >> 8; // 向右移8位 + } + return b; + } + + private short[] IntToShorts(int value) { + short[] res = new short[2]; + int temp = value; + byte[] b = new byte[4]; + for (int i = 0; i < b.length; i++) { + b[i] = new Integer(temp & 0xff).byteValue();// 将最低位保存在最低位 + temp = temp >> 8; // 向右移8位 + } + for (int i = 0; i < res.length; i++) { + short s0 = (short) (b[i * 2] & 0xff);// 最低位 + short s1 = (short) (b[i * 2 + 1] & 0xff); + s1 <<= 8; + res[i] = (short) (s0 | s1); + } + return res; + } + + public static String GetString(short[] src, int start, int len) throws UnsupportedEncodingException { + short[] temp = new short[len]; + for (int i = 0; i < len; i++) { + temp[i] = src[i + start]; + } + byte[] bytesTemp = shorts2Bytes(temp); + for (int i = 0; i < bytesTemp.length; i++) { + byte b = bytesTemp[i]; + } + String str = new String(bytesTemp, "UTF-8"); + return str; + } + + public static byte[] shorts2Bytes(short[] data) { + byte[] byteValue = new byte[data.length * 2]; + for (int i = 0; i < data.length; i++) { + byteValue[i * 2] = (byte) (data[i] & 0xff); + byteValue[i * 2 + 1] = (byte) ((data[i] & 0xff00) >> 8); + } + return byteValue; + } + + /*** + *读取实时状态 + * @param Address the address + * @param length 读取的长度 3 + * @param callback 读取成功的回调 + */ + public void ReadStatus(String Address, int length, IReadCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + try { + ReadHoldingRegistersResponse res = ModbusTcpMainHelper.get().syncReadHoldingRegisters(1, add, length); + byte[] data = res.getData(); + byte[] tempData = new byte[6]; + tempData[0] = data[1]; + tempData[1] = data[0]; + if (callback != null) callback.onSuccess(tempData); + } catch (InterruptedException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } + } + + /*** + *读取扫码数据 + * @param Address the address + * @param length 读取的长度 + * @param callback 读取成功的回调 + */ + public void ReadString(String Address, int length, IReadCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + try { + ReadHoldingRegistersResponse res = ModbusTcpMainHelper.get().syncReadHoldingRegisters(1, add, length); + byte[] data = res.getData(); + byte[] data1 = Arrays.copyOfRange(data, 0, length); + //36 GUID 18 Number + String id = ""; + try { + byte[] tempdata = new byte[length]; + for (int i = 0; i < data1.length; i++) { + if (i % 2 == 0) { + + tempdata[i + 1] = data1[i]; + } else { + tempdata[i - 1] = data1[i]; + } + } + id = new String(tempdata, "UTF-8").trim(); + } catch (UnsupportedEncodingException ex) { + } + if (callback != null) callback.onSuccess(id); + } catch (InterruptedException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } + } + + public void WriteString(String Address, int length, IWriteCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + short[] send = new short[length]; + for (short item : send) { + item = 0; + } + try { + ModbusTcpMainHelper.get().syncWriteRegisters(1, add, send); + if (callback != null) + callback.onSuccess(); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } + } + + public void ReadShort(String Address, int length, IReadCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + try { + ReadHoldingRegistersResponse res = ModbusTcpMainHelper.get().syncReadHoldingRegisters(1, add, length); + short[] data = res.getShortData(); + if (data.length == length) { + if (callback != null) callback.onSuccess(data); + } + } catch (InterruptedException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("ReadShort onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } + } + + public void ReadBool(String Address, int length, IReadCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + try { + ReadCoilsResponse res = ModbusTcpMainHelper.get().syncReadCoil(1, add, length); + boolean[] data = res.getBooleanData(); + boolean[] result = Arrays.copyOfRange(data, 0, length); + if (result.length == length) { + if (callback != null) callback.onSuccess(result); + } + } catch (InterruptedException e) { + MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("ReadBool onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } + } + + public void ReadFloat(String Address, int length, IReadCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + try { + ReadHoldingRegistersResponse res = ModbusTcpMainHelper.get().syncReadHoldingRegisters(1, add, length); + byte[] data = res.getData(); + float[] tempValues = new float[length]; + for (int i = 0; i < length; i++) { + byte[] tempData = new byte[4]; + for (int m = 0; m < 4; m++) { + tempData[m] = data[i * 4 + m]; + } + tempValues[i] = BytesToFloat(tempData, DataFormat.ABCD); + } + if (tempValues.length == length) { + if (callback != null) callback.onSuccess(tempValues); + } + } catch (InterruptedException e) { + MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("ReadFloat onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } + } + + public void ReadInt(String Address, int length, IReadCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + try { + ReadHoldingRegistersResponse res = ModbusTcpMainHelper.get().syncReadHoldingRegisters(1, add, length * 2); + byte[] data = res.getData(); + int[] tempValues = new int[length]; + if(data.length>=4) + { + for (int i = 0; i < length; i++) { + byte[] tempData = new byte[4]; + for (int m = 0; m < 4; m++) { + tempData[m] = data[i * 4 + m]; + } +// Integer a1 = tempValues[i] = BytesToInt(tempData, DataFormat.ABCD); +// Integer a2 = tempValues[i] = BytesToInt(tempData, DataFormat.BADC); +// Integer a3 = tempValues[i] = BytesToInt(tempData, DataFormat.CDAB); +// Integer a4 = tempValues[i] = BytesToInt(tempData, DataFormat.DCBA); + tempValues[i] = BytesToInt(tempData, DataFormat.BADC); + } + }else + { + MessageLog.ShowError("ReadInt onFailure,Address=" ); + + } + if (callback != null) callback.onSuccess(tempValues); + } catch (InterruptedException e) { + MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("ReadInt onFailure,Address=" + Address + ",length=" + length + ",msg:" + e.toString()); + } + } + + public void WriteShort(String Address, short Value, IWriteCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + short[] send = new short[1]; + send[0] = Value; + try { + ModbusTcpMainHelper.get().syncWriteRegisters(1, add, send); + if (callback != null) + callback.onSuccess(); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } + } + + public void WriteBool(String Address, boolean Value, IWriteCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + try { + ModbusTcpMainHelper.get().syncWriteCoil(1, add, Value); + if (callback != null) + callback.onSuccess(); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } + } + + public void WriteFloat(String Address, float Value, IWriteCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + int intBits = Float.floatToRawIntBits(Value); + short[] send = new short[]{(short) ((intBits >> 16) & 0xffff), (short) (intBits & 0xffff)}; + try { + ModbusTcpMainHelper.get().syncWriteRegisters(1, add, send); + + if (callback != null) callback.onSuccess(); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } + } + + public void WriteInt(String Address, int Value, IWriteCallBack callback) { + int add = GetAddress(Address); + if (add < 0) return; + short[] send = IntToShorts(Value); + try { + ModbusTcpMainHelper.get().syncWriteRegisters(1, add, send); + if (callback != null) callback.onSuccess(); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + if (callback != null) callback.onFailure(e.toString()); + } + } + + public void WriteShort(String Address, short Value) { + int add = GetAddress(Address); + if (add < 0) return; + short[] send = new short[1]; + send[0] = Value; + try { + ModbusTcpMainHelper.get().syncWriteRegisters(1, add, send); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteShort onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } + } + + public void WriteBool(String Address, boolean Value) { + int add = GetAddress(Address); + if (add < 0) return; + + try { + ModbusTcpMainHelper.get().syncWriteCoil(1, add, Value); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteBool onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } + } + + public void WriteFloat(String Address, float Value) { + int add = GetAddress(Address); + if (add < 0) return; + int intBits = Float.floatToRawIntBits(Value); + short[] send = new short[]{(short) ((intBits >> 16) & 0xffff), (short) (intBits & 0xffff)}; + try { + ModbusTcpMainHelper.get().syncWriteRegisters(1, add, send); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteFloat onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } + } + + public void WriteInt(String Address, int Value) { + int add = GetAddress(Address); + if (add < 0) return; + short[] send = IntToShorts(Value); + try { + ModbusTcpMainHelper.get().syncWriteRegisters(1, add, send); + } catch (InterruptedException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ExecutionException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusTransportException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusInitException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } catch (ModbusRespException e) { + MessageLog.ShowError("WriteInt onFailure,Address=" + Address + ",length=" + Value + ",msg:" + e.toString()); + } + } +} diff --git a/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpServer.java b/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpServer.java index 758545ec..6a08c960 100644 --- a/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpServer.java +++ b/app/src/main/java/com/bonait/bnframework/common/modbus/ModbusTcpServer.java @@ -232,38 +232,6 @@ public class ModbusTcpServer { }); } -// /** -// * 重新连接Modbus -// */ -// public void ReconnectModbus() -// { -// try { -// -// ThreadManager.Get().StartLong("PLC断线重连线程", true, new IThread() { -// @Override -// public void Run() throws InterruptedException { -// try { -// boolean status =ping2(ConfigName.getInstance().Address,1,1); -// if(status) -// { -// ModbusMaster master= ModbusTcpHelper.get().getModbusMaster(); -// if (master==null || master.isConnected() == false) { -// ConnectPLC(); -// } -// Thread.sleep(20000); -// } -// } catch (Exception e) { -// Log.i("PLC", "PLC重连接失败!"+e.getMessage()); -// } -// } -// @Override -// public void RunComplete() throws InterruptedException { -// } -// }); -// }catch (Exception e) { -// MessageLog.ShowInfo("重新连接Modbus异常," +e.getMessage()); -// } -// } private Float BytesToFloat(byte[] buffers, DataFormat df) { if (buffers.length == 4) { diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigation2Activity.java b/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigation2Activity.java index 47fe28e8..aa55d9d4 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigation2Activity.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigation2Activity.java @@ -10,6 +10,7 @@ import com.bonait.bnframework.common.constant.DataBus; import com.bonait.bnframework.common.helper.I.IThread; import com.bonait.bnframework.common.helper.MessageLog; import com.bonait.bnframework.common.helper.ThreadManager; +import com.bonait.bnframework.common.modbus.ModbusTcpMainServer; import com.bonait.bnframework.common.modbus.ModbusTcpServer; import com.bonait.bnframework.common.utils.NetworkUtils; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -204,6 +205,28 @@ public class BottomNavigation2Activity extends BaseActivity { ConfigName.getInstance().PlcIsConnect = false; } } + + if(ConfigName.getInstance().versionSelectionEnum.contains("一拖")) + { + if (ConfigName.getInstance().PlcMainIsConnect) { + //ping 不通 + boolean status = ModbusTcpMainServer.ping2(ConfigName.getInstance().MainAddress, 1, 1); + if (!status) //ping 不通 连接 + { + MessageLog.ShowInfo("主控PLC状态断开,尝试连接..."); + ConfigName.getInstance().PlcMainIsConnect = false; + } + } else { + boolean status = ModbusTcpMainServer.ping2(ConfigName.getInstance().MainAddress, 1, 1); + if (status) { + MessageLog.ShowInfo("设备 " + ConfigName.getInstance().MainAddress + " 主控PLC通讯正常,准备连接!"); + ModbusTcpMainServer.ConnectPLC(); + } else { + MessageLog.ShowInfo("主控PLC状态断开,尝试连接..."); + ConfigName.getInstance().PlcMainIsConnect = false; + } + } + } Thread.sleep(10000); } catch (Exception e) { Log.i("PLC", "PLC重连接失败!" + e.getMessage()); @@ -214,6 +237,8 @@ public class BottomNavigation2Activity extends BaseActivity { public void RunComplete() throws InterruptedException { } }); + + } catch (Exception e) { MessageLog.ShowInfo("重新连接Modbus异常," + e.getMessage()); } diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigationNewActivity.java b/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigationNewActivity.java index 3b4ef361..1cba7d30 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigationNewActivity.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/activity/BottomNavigationNewActivity.java @@ -28,6 +28,7 @@ import com.bonait.bnframework.common.helper.MessageLog; import com.bonait.bnframework.common.helper.ThreadManager; import com.bonait.bnframework.common.message.MessageLooper; import com.bonait.bnframework.common.message.MessageManager; +import com.bonait.bnframework.common.modbus.ModbusTcpMainServer; import com.bonait.bnframework.common.modbus.ModbusTcpServer; import com.bonait.bnframework.common.utils.NetworkUtils; import com.bonait.bnframework.common.utils.ToastUtils; @@ -100,12 +101,17 @@ public class BottomNavigationNewActivity extends BaseActivity { }; viewPager.setCurrentItem(1); } + @Override protected void onDestroy() { ConfigData.getInstance().ColsePLC(); - IsRunThread=false; - if(makeThread!=null){makeThread=null;} - if(makeThreadDC!=null){makeThreadDC=null;} + IsRunThread = false; + if (makeThread != null) { + makeThread = null; + } + if (makeThreadDC != null) { + makeThreadDC = null; + } super.onDestroy(); } @@ -145,10 +151,34 @@ public class BottomNavigationNewActivity extends BaseActivity { @Override public void onMessage(Object msg) { if (msg != null) { - String id = (String) msg; - goods = QueryDB.GetGoodsId(id); - cooking.initData(goods, activity, myClickListener); - cooking.setVisibility(View.VISIBLE); + runOnUiThread(new Runnable() { + @Override + public void run() { + String id = (String) msg; + goods = QueryDB.GetGoodsId(id); + cooking.initData(goods, activity, myClickListener); + cooking.setVisibility(View.VISIBLE); + } + }); + + } + } + }); + + //打开制作界面 + MessageManager.getInstance().registerMessageReceiver(this, MessageName.IsStratMakeGood, new MessageLooper.OnMessageListener() { + @Override + public void onMessage(Object msg) { + if (msg != null) { + runOnUiThread(new Runnable() { + @Override + public void run() { + ExecuteTheRecipe.IsPause = false; + ExecuteTheRecipe.WritePLC("暂停开关", false, null); + onRecordStart(); + } + }); + } } }); @@ -249,7 +279,6 @@ public class BottomNavigationNewActivity extends BaseActivity { */ public void ReconnectModbus() { try { - ThreadManager.Get().StartLong("PLC断线重连线程", true, new IThread() { @Override public void Run() throws InterruptedException { @@ -272,6 +301,27 @@ public class BottomNavigationNewActivity extends BaseActivity { ConfigName.getInstance().PlcIsConnect = false; } } + + if (ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { + if (ConfigName.getInstance().PlcMainIsConnect) { + //ping 不通 + boolean status = ModbusTcpMainServer.ping2(ConfigName.getInstance().MainAddress, 1, 1); + if (!status) //ping 不通 连接 + { + MessageLog.ShowInfo("主控PLC状态断开,尝试连接..."); + ConfigName.getInstance().PlcMainIsConnect = false; + } + } else { + boolean status = ModbusTcpMainServer.ping2(ConfigName.getInstance().MainAddress, 1, 1); + if (status) { + MessageLog.ShowInfo("设备 " + ConfigName.getInstance().MainAddress + " 主控PLC通讯正常,准备连接!"); + ModbusTcpMainServer.ConnectPLC(); + } else { + MessageLog.ShowInfo("主控PLC状态断开,尝试连接..."); + ConfigName.getInstance().PlcMainIsConnect = false; + } + } + } Thread.sleep(10000); } catch (Exception e) { Log.i("PLC", "PLC重连接失败!" + e.getMessage()); @@ -296,22 +346,22 @@ public class BottomNavigationNewActivity extends BaseActivity { public BPA_GOODS goods = null; - public Thread makeThread=null; - public Thread makeThreadDC=null; - public boolean IsRunThread=true; + public Thread makeThread = null; + public Thread makeThreadDC = null; + public boolean IsRunThread = true; /** * 商品制作线程 */ public void MakeThread() { ExecuteTheRecipe.context = this; - makeThread=new Thread(new Runnable() { + makeThread = new Thread(new Runnable() { @Override public void run() { while (IsRunThread) { try { if (ExecuteTheRecipe.IsStart && goods != null) { - long startTime= System.currentTimeMillis(); //起始时间 + long startTime = System.currentTimeMillis(); //起始时间 try { //获取工艺 ArrayList goodsrecipes = QueryDB.GetGoodsSrecipeID(goods.id); @@ -319,8 +369,7 @@ public class BottomNavigationNewActivity extends BaseActivity { gongxuIndex = 1; int m = 0; for (BPA_GOODSRECIPE item : goodsrecipes) { - while (ExecuteTheRecipe.IsPause) - { + while (ExecuteTheRecipe.IsPause) { ToastUtils.info("客官,当前菜品已暂停炒制!!!"); Thread.sleep(1000); } @@ -348,12 +397,14 @@ public class BottomNavigationNewActivity extends BaseActivity { ExecuteTheRecipe.IsStart = false; long endTime = System.currentTimeMillis(); //结束时间 - int time=(int) ((endTime-startTime)/1000); - Log.e("运行时长",String.format("方法使用时间 %d s",time)); + int time = (int) ((endTime - startTime) / 1000); + Log.e("运行时长", String.format("方法使用时间 %d s", time)); - if (!ExecuteTheRecipe.IsForcedEnd){QueryDB.UpdateGoodsMakeTime(goods.id,time);} + if (!ExecuteTheRecipe.IsForcedEnd) { + QueryDB.UpdateGoodsMakeTime(goods.id, time); + } - ExecuteTheRecipe.all_list=new ArrayList<>(); + ExecuteTheRecipe.all_list = new ArrayList<>(); runOnUiThread(new Runnable() { @Override public void run() { @@ -377,7 +428,7 @@ public class BottomNavigationNewActivity extends BaseActivity { }); makeThread.start(); - makeThreadDC=new Thread(new Runnable() { + makeThreadDC = new Thread(new Runnable() { @Override public void run() { while (IsRunThread) { @@ -490,17 +541,14 @@ public class BottomNavigationNewActivity extends BaseActivity { switch (v.getId()) { case R.id.start_goodmake://启动按钮 ExecuteTheRecipe.IsPause = false; - ExecuteTheRecipe.WritePLC("暂停开关",false,null); + ExecuteTheRecipe.WritePLC("暂停开关", false, null); if (Status) { onRecordStart(); } -// else { -// onRecordStop(); -// } break; case R.id.zanting_goodmake://暂停按钮 ExecuteTheRecipe.IsPause = Status; - ExecuteTheRecipe.WritePLC("暂停开关",Status,null); + ExecuteTheRecipe.WritePLC("暂停开关", Status, null); if (Status) { onRecordPause(); } else { diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/Home1Fragment.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/Home1Fragment.java index 7e63c2cb..ab5f053c 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/Home1Fragment.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/Home1Fragment.java @@ -35,6 +35,7 @@ import com.bonait.bnframework.business.ExecuteTheRecipe; import com.bonait.bnframework.common.base.BaseFragment; import com.bonait.bnframework.common.constant.ConfigName; import com.bonait.bnframework.common.constant.DataBus; +import com.bonait.bnframework.common.constant.MessageName; import com.bonait.bnframework.common.db.QueryDB; import com.bonait.bnframework.common.db.mode.BPA_GOODS; import com.bonait.bnframework.common.db.mode.BPA_GOODSRECIPE; @@ -46,6 +47,8 @@ import com.bonait.bnframework.common.helper.I.MyClickListener; import com.bonait.bnframework.common.helper.Json; import com.bonait.bnframework.common.helper.MessageLog; import com.bonait.bnframework.common.helper.ThreadManager; +import com.bonait.bnframework.common.message.MessageLooper; +import com.bonait.bnframework.common.message.MessageManager; import com.bonait.bnframework.common.modbus.ModbusTcpServer; import com.bonait.bnframework.common.utils.AlertDialogUtils; import com.bonait.bnframework.common.utils.ToastUtils; @@ -153,6 +156,7 @@ public class Home1Fragment extends BaseFragment { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); context = getContext(); + initTopBar(); initData(); HuoLiClicked(); @@ -232,13 +236,20 @@ public class Home1Fragment extends BaseFragment { DataBus.getInstance().mListener = new MyClickListener() { @Override public void clickListener(View v, Object data) { - if (!IsMake(true)) { - return; - } - good = (BPA_GOODS) data; - SetBottonStatus(false); - caipumingcheng.setText(good.name); - SetProcesssUI(good.maketime, 0); + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (!IsMake(true)) { + return; + } + good = (BPA_GOODS) data; + SetBottonStatus(false); + caipumingcheng.setText(good.name); + SetProcesssUI(good.maketime, 0); + } + }); + } @Override @@ -523,6 +534,22 @@ public class Home1Fragment extends BaseFragment { } }); + + MessageManager.getInstance().registerMessageReceiver(getActivity(), MessageName.IsStratMakeGood1, new MessageLooper.OnMessageListener() { + @Override + public void onMessage(Object msg) { + if (msg != null) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + ExecuteTheRecipe.StopForcedEnd(); + SetBottonStatus(true); + } + }); + + } + } + }); } int gongxuIndex = 10000; diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/HomeFragmentSBKZ.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/HomeFragmentSBKZ.java index 10f1866c..a639359a 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/HomeFragmentSBKZ.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/HomeFragmentSBKZ.java @@ -305,7 +305,7 @@ public class HomeFragmentSBKZ extends BaseFragment { SetStirFrySpeed(SpeedEnum.停, false); RefreshLiquidSilo(); - if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本")) { + if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本") || ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { touliao_k.setVisibility(View.GONE); touliao_m.setVisibility(View.GONE); device_image.setImageResource(R.mipmap.device00); diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingActivity.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingActivity.java index 4887699e..cc94cacb 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingActivity.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingActivity.java @@ -183,7 +183,7 @@ public class CookingActivity extends LinearLayout { SetMiaoShu("等待开始..."); runtime.setText(formatTime(goods.maketime)); - if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本")) { + if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本") || ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { touliao_k.setVisibility(View.GONE); touliao_m.setVisibility(View.GONE); device_image.setImageResource(R.mipmap.device00); diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingSimulatedActivity.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingSimulatedActivity.java index 81d23d21..c17d247c 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingSimulatedActivity.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/CookingSimulatedActivity.java @@ -147,7 +147,7 @@ public class CookingSimulatedActivity extends BaseActivity { * 初始化数据 */ public void initData() { - if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本")) { + if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本") || ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { touliao_k.setVisibility(View.GONE); touliao_m.setVisibility(View.GONE); device_image.setImageResource(R.mipmap.device00); diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/DishTestActivity.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/DishTestActivity.java index e87bc156..39f60a00 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/DishTestActivity.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/DishTestActivity.java @@ -267,7 +267,7 @@ public class DishTestActivity extends BaseActivity { * 初始化显示数据 */ private void initData() { - if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本")) { + if (ConfigName.getInstance().versionSelectionEnum.equals("大炒版本") || ConfigName.getInstance().versionSelectionEnum.contains("一拖")) { touliao_k.setVisibility(View.GONE); touliao_m.setVisibility(View.GONE); device_image.setImageResource(R.mipmap.device00); diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/WhActivity.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/WhActivity.java index 8b5754f9..33e59a07 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/WhActivity.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/WhActivity.java @@ -6,6 +6,7 @@ import com.bonait.bnframework.common.constant.ConfigName; import com.bonait.bnframework.common.utils.ToastUtils; import com.bonait.bnframework.modules.home.fragment.from.fragment.SystemCsPLCFragment; import com.bonait.bnframework.modules.home.fragment.from.fragment.WokSetGKCXFragment; +import com.bonait.bnframework.modules.home.fragment.from.fragment.WokSetTLZZ1Fragment; import com.bonait.bnframework.modules.home.fragment.from.fragment.WokSetTLZZFragment; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -102,7 +103,13 @@ public class WhActivity extends BaseActivity { private void initFragment() { fragmentAdapter = new FragmentAdapter(getSupportFragmentManager()); fragmentAdapter.addFragment(new WokSetGKCXFragment()); - fragmentAdapter.addFragment(new WokSetTLZZFragment()); + if (ConfigName.getInstance().versionSelectionEnum.contains("一拖")) + { + fragmentAdapter.addFragment(new WokSetTLZZ1Fragment()); + }else + { + fragmentAdapter.addFragment(new WokSetTLZZFragment()); + } fragmentAdapter.addFragment(new SystemCsMonitorFragment()); fragmentAdapter.addFragment(new SystemCsFltlFragment()); viewPager.setAdapter(fragmentAdapter); diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/SystemSystemsetFragment.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/SystemSystemsetFragment.java index 2ccefd15..5a70b500 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/SystemSystemsetFragment.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/SystemSystemsetFragment.java @@ -43,6 +43,13 @@ public class SystemSystemsetFragment extends BaseFragment { EditText edittext3; @BindView(R.id.edittext4) EditText edittext4; + + @BindView(R.id.edittext100) + EditText edittext100; + @BindView(R.id.edittext101) + EditText edittext101; + @BindView(R.id.edittext102) + EditText edittext102; @BindView(R.id.environment) Spinner environment; @@ -133,6 +140,18 @@ public class SystemSystemsetFragment extends BaseFragment { bpa_systemsets = QueryDB.GetSystemsetALL(); for (BPA_SYSTEMSET item : bpa_systemsets) { switch (item.type) { + case -200: + ConfigName.getInstance().MainAddress = item.value; + edittext100.setText(item.value); + break; + case -201: + ConfigName.getInstance().MainPost = Integer.parseInt(item.value); + edittext101.setText(item.value); + break; + case -202: + ConfigName.getInstance().DeviceHao = Integer.parseInt(item.value); + edittext102.setText(item.value); + break; case -100: ConfigName.getInstance().versionSelectionEnum = item.value; versionselection.setSelection(material_map_vis.get(item.value)); @@ -192,6 +211,10 @@ public class SystemSystemsetFragment extends BaseFragment { case R.id.StartButton://保存按钮 ConfigName.getInstance().Address = edittext1.getText().toString(); ConfigName.getInstance().Post = Integer.parseInt(edittext2.getText().toString()); + ConfigName.getInstance().MainAddress = edittext100.getText().toString(); + ConfigName.getInstance().MainPost = Integer.parseInt(edittext101.getText().toString()); + ConfigName.getInstance().DeviceHao = Integer.parseInt(edittext102.getText().toString()); + ConfigName.getInstance().ClientAutoKey = edittext3.getText().toString(); ConfigName.getInstance().DeviceAutoKey = edittext4.getText().toString(); @@ -228,6 +251,28 @@ public class SystemSystemsetFragment extends BaseFragment { set_vis.deviceID = ConfigName.getInstance().DeviceId; set_vis.userID = ConfigName.getInstance().user.userID; QueryDB.AddSystemset(set_vis); + + BPA_SYSTEMSET set_main1 = new BPA_SYSTEMSET(); + set_main1.type = -200; + set_main1.value = edittext100.getText().toString(); + set_main1.deviceID = ConfigName.getInstance().DeviceId; + set_main1.userID = ConfigName.getInstance().user.userID; + QueryDB.AddSystemset(set_main1); + + BPA_SYSTEMSET set_main2 = new BPA_SYSTEMSET(); + set_main2.type = -201; + set_main2.value =edittext101.getText().toString(); + set_main2.deviceID = ConfigName.getInstance().DeviceId; + set_main2.userID = ConfigName.getInstance().user.userID; + QueryDB.AddSystemset(set_main2); + + BPA_SYSTEMSET set_main3 = new BPA_SYSTEMSET(); + set_main3.type = -202; + set_main3.value =edittext102.getText().toString(); + set_main3.deviceID = ConfigName.getInstance().DeviceId; + set_main3.userID = ConfigName.getInstance().user.userID; + QueryDB.AddSystemset(set_main3); + if (isgb) { ConfigData.getInstance().RevertPLCProcess(); } diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/WokSetTLZZ1Fragment.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/WokSetTLZZ1Fragment.java new file mode 100644 index 00000000..4f0b40c3 --- /dev/null +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/WokSetTLZZ1Fragment.java @@ -0,0 +1,437 @@ +package com.bonait.bnframework.modules.home.fragment.from.fragment; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.appcompat.app.AppCompatActivity; + +import android.content.Context; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.TextView; + +import com.bonait.bnframework.R; +import com.bonait.bnframework.business.ExecuteTheRecipe; +import com.bonait.bnframework.common.base.BaseFragment; +import com.bonait.bnframework.common.utils.ToastUtils; +import com.orhanobut.logger.Logger; + +import butterknife.BindView; +import butterknife.ButterKnife; +import butterknife.OnClick; + +public class WokSetTLZZ1Fragment extends BaseFragment { + + //region 变量 + @BindView(R.id.pyz_zz) + Button pyz_zz; + + @BindView(R.id.pyz_fz) + Button pyz_fz; + + @BindView(R.id.fzz_zz) + Button fzz_zz; + + @BindView(R.id.fzz_fz) + Button fzz_fz; + + + @BindView(R.id.edit_pyz_hlsd) + EditText edit_pyz_hlsd; + + @BindView(R.id.edit_pyz_ddsd) + EditText edit_pyz_ddsd; + + @BindView(R.id.edit_pyz_zdsd) + EditText edit_pyz_zdsd; + + @BindView(R.id.edit_fzz_hlsd) + EditText edit_fzz_hlsd; + + @BindView(R.id.edit_fzz_ddsd) + EditText edit_fzz_ddsd; + + @BindView(R.id.edit_fzz_zdsd) + EditText edit_fzz_zdsd; + + @BindView(R.id.edit_pyz_dqz) + TextView edit_pyz_dqz; + @BindView(R.id.edit_pyz_wz1) + TextView edit_pyz_wz1; + @BindView(R.id.edit_pyz_wz2) + TextView edit_pyz_wz2; + @BindView(R.id.edit_pyz_wz3) + TextView edit_pyz_wz3; + @BindView(R.id.edit_pyz_wz4) + TextView edit_pyz_wz4; + + @BindView(R.id.edit_fzz_dqz) + TextView edit_fzz_dqz; + @BindView(R.id.edit_fzz_wz1) + TextView edit_fzz_wz1; + @BindView(R.id.edit_fzz_wz2) + TextView edit_fzz_wz2; + @BindView(R.id.edit_fzz_wz3) + TextView edit_fzz_wz3; + @BindView(R.id.edit_fzz_wz4) + TextView edit_fzz_wz4; + //endregion + + //region 界面 + private Context context; + + @Override + protected View onCreateView() { + View root = LayoutInflater.from(getActivity()).inflate(R.layout.fragment_wok_set_tlzz1, null); + ButterKnife.bind(this, root); + return root; + } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + Logger.d("我的fragment创建"); + context = getContext(); + Init(); + RefreshThread(); + } + //endregion + + //region 公共 + + /** + * 初始化 + */ + public void Init() { + new Thread(new Runnable() { + @Override + public void run() { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + SetShowValue("翻转1-回原点速度", edit_pyz_hlsd); + SetShowValue("翻转1-点动速度", edit_pyz_ddsd); + SetShowValue("翻转1-定位运行速度", edit_pyz_zdsd); + + SetShowValue("翻转2-回原点速度", edit_fzz_hlsd); + SetShowValue("翻转2-点动速度", edit_fzz_ddsd); + SetShowValue("翻转2-定位运行速度", edit_fzz_zdsd); + } + }); + } + }).start(); + + pyz_zz.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + Log.e("鼠标", "按下: "); + ExecuteTheRecipe.WritePLC("翻转1-点动正转", true, null); + } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { + Log.e("鼠标", "松开: "); + ExecuteTheRecipe.WritePLC("翻转1-点动正转", false, null); + } + return false; + } + }); + + pyz_fz.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + Log.e("鼠标", "按下: "); + ExecuteTheRecipe.WritePLC("翻转1-点动反转", true, null); + } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { + Log.e("鼠标", "松开: "); + ExecuteTheRecipe.WritePLC("翻转1-点动反转", false, null); + } + return false; + } + }); + + fzz_zz.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + Log.e("鼠标", "按下: "); + ExecuteTheRecipe.WritePLC("翻转2-点动正转", true, null); + } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { + Log.e("鼠标", "松开: "); + ExecuteTheRecipe.WritePLC("翻转2-点动正转", false, null); + } + return false; + } + }); + + fzz_fz.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View view, MotionEvent motionEvent) { + if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { + Log.e("鼠标", "按下: "); + ExecuteTheRecipe.WritePLC("翻转2-点动反转", true, null); + } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { + Log.e("鼠标", "松开: "); + ExecuteTheRecipe.WritePLC("翻转2-点动反转", false, null); + } + return false; + } + }); + } + + /** + * 刷新UI线程 + */ + public void RefreshThread() { + new Thread(new Runnable() { + @Override + public void run() { + try { + while (true) { + Object o0 = ExecuteTheRecipe.ReadPLC("翻转1-伺服当前值"); + Object o1 = ExecuteTheRecipe.ReadPLC("翻转1-1号位置值"); + Object o2 = ExecuteTheRecipe.ReadPLC("翻转1-2号位置值"); + Object o3 = ExecuteTheRecipe.ReadPLC("翻转1-3号位置值"); + Object o4 = ExecuteTheRecipe.ReadPLC("翻转1-4号位置值"); + + Object m0 = ExecuteTheRecipe.ReadPLC("翻转2-伺服当前值"); + Object m1 = ExecuteTheRecipe.ReadPLC("翻转2-1号位置值"); + Object m2 = ExecuteTheRecipe.ReadPLC("翻转2-2号位置值"); + Object m3 = ExecuteTheRecipe.ReadPLC("翻转2-3号位置值"); + Object m4 = ExecuteTheRecipe.ReadPLC("翻转2-4号位置值"); + + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (o0 != null) { + edit_pyz_dqz.setText(o0 + ""); + } else { + edit_pyz_dqz.setText("未知"); + } + if (o1 != null) { + edit_pyz_wz1.setText(o1 + ""); + } else { + edit_pyz_wz1.setText("未知"); + } + if (o2 != null) { + edit_pyz_wz2.setText(o2 + ""); + } else { + edit_pyz_wz2.setText("未知"); + } + if (o3 != null) { + edit_pyz_wz3.setText(o3 + ""); + } else { + edit_pyz_wz3.setText("未知"); + } + if (o4 != null) { + edit_pyz_wz4.setText(o4 + ""); + } else { + edit_pyz_wz4.setText("未知"); + } + + if (m0 != null) { + edit_fzz_dqz.setText(m0 + ""); + } else { + edit_fzz_dqz.setText("未知"); + } + if (m1 != null) { + edit_fzz_wz1.setText(m1 + ""); + } else { + edit_fzz_wz1.setText("未知"); + } + if (m2 != null) { + edit_fzz_wz2.setText(m2 + ""); + } else { + edit_fzz_wz2.setText("未知"); + } + if (m3 != null) { + edit_fzz_wz3.setText(m3 + ""); + } else { + edit_fzz_wz3.setText("未知"); + } + if (m4 != null) { + edit_fzz_wz4.setText(m4 + ""); + } else { + edit_fzz_wz4.setText("未知"); + } + } + }); + Thread.sleep(500); + } + } catch (Exception ex) { + } + } + }).start(); + } + + /** + * 点击事件 + * + * @param view + */ + @OnClick({ + R.id.pyz_hl, + R.id.pyz_wzsz1, R.id.pyz_wzsz2, R.id.pyz_wzsz3, R.id.pyz_wzsz4, + R.id.pyz_qu1, R.id.pyz_qu2, R.id.pyz_qu3, R.id.pyz_qu4, + + R.id.fzz_hl, + R.id.fzz_wzsz1, R.id.fzz_wzsz2, R.id.fzz_wzsz3, R.id.fzz_wzsz4, + R.id.fzz_qu1, R.id.fzz_qu2, R.id.fzz_qu3, R.id.fzz_qu4, + + R.id.dcqd_button1,R.id.dcqd_button2, + + R.id.pyz_savevalue, R.id.fzz_savevalue + }) + public void onViewClicked(View view) { + switch (view.getId()) { + case R.id.pyz_hl: + ButtomZhiWeiZhi("翻转1-回原点"); + break; + case R.id.pyz_wzsz1: + ButtomZhiWeiZhi("翻转1-1#位置设定"); + break; + case R.id.pyz_wzsz2: + ButtomZhiWeiZhi("翻转1-2#位置设定"); + break; + case R.id.pyz_wzsz3: + ButtomZhiWeiZhi("翻转1-3#位置设定"); + break; + case R.id.pyz_wzsz4: + ButtomZhiWeiZhi("翻转1-4#位置设定"); + break; + case R.id.pyz_qu1: + ButtomZhiWeiZhi("翻转1-去1号位"); + break; + case R.id.pyz_qu2: + ButtomZhiWeiZhi("翻转1-去2号位"); + break; + case R.id.pyz_qu3: + ButtomZhiWeiZhi("翻转1-去3号位"); + break; + case R.id.pyz_qu4: + ButtomZhiWeiZhi("翻转1-去4号位"); + break; + + case R.id.fzz_hl: + ButtomZhiWeiZhi("翻转2-回原点"); + break; + case R.id.fzz_wzsz1: + ButtomZhiWeiZhi("翻转2-1#位置设定"); + break; + case R.id.fzz_wzsz2: + ButtomZhiWeiZhi("翻转2-2#位置设定"); + break; + case R.id.fzz_wzsz3: + ButtomZhiWeiZhi("翻转2-3#位置设定"); + break; + case R.id.fzz_wzsz4: + ButtomZhiWeiZhi("翻转2-4#位置设定"); + break; + case R.id.fzz_qu1: + ButtomZhiWeiZhi("翻转2-去1号位"); + break; + case R.id.fzz_qu2: + ButtomZhiWeiZhi("翻转2-去2号位"); + break; + case R.id.fzz_qu3: + ButtomZhiWeiZhi("翻转2-去3号位"); + break; + case R.id.fzz_qu4: + ButtomZhiWeiZhi("翻转2-去4号位"); + break; + case R.id.dcqd_button1: + ButtomZhiWeiZhi("主料1号位"); + break; + case R.id.dcqd_button2: + ButtomZhiWeiZhi("主料2号位"); + break; + + case R.id.pyz_savevalue: + SaveValue("翻转1", edit_pyz_hlsd, edit_pyz_ddsd, edit_pyz_zdsd); + break; + case R.id.fzz_savevalue: + SaveValue("翻转2", edit_fzz_hlsd, edit_fzz_ddsd, edit_fzz_zdsd); + break; + } + } + //endregion + + //region 私有 + + /** + * 写入设置值 + * + * @param name + * @param edit1 + * @param edit2 + */ + private void SaveValue(String name, EditText edit1, EditText edit2, EditText edit3) { + String val1 = edit1.getText().toString(); + String val2 = edit2.getText().toString(); + String val3 = edit3.getText().toString(); + + if (val1.isEmpty()) { + ToastUtils.warning(name + "回零速度不能为空!"); + return; + } + if (val2.isEmpty()) { + ToastUtils.warning(name + "点动速度不能为空!"); + return; + } + if (val3.isEmpty()) { + ToastUtils.warning(name + "自动速度不能为空!"); + return; + } + int va1 = 0; + int va2 = 0; + int va3 = 0; + + try { + va1 = Integer.parseInt(val1); + va2 = Integer.parseInt(val2); + va3 = Integer.parseInt(val3); + + } catch (Exception ex) { + ToastUtils.warning(name + "异常了," + ex.getMessage()); + return; + } + + ExecuteTheRecipe.WritePLC(name + "-回原点速度", va1, null); + ExecuteTheRecipe.WritePLC(name + "-点动速度", va2, null); + ExecuteTheRecipe.WritePLC(name + "-定位运行速度", va3, null); + ToastUtils.info(name + "保存成功!"); + } + + /** + * 根据监听设置值 + * + * @param name + * @param edit1 + */ + private void SetShowValue(String name, EditText edit1) { + Object val1 = ExecuteTheRecipe.ListeningValue.get(name); + if (val1 != null) { + String str = String.valueOf(val1); + edit1.setText(str.toCharArray(), 0, str.length()); + } + } + + /** + * 执行去某个位置 + */ + private void ButtomZhiWeiZhi(String name) { + ExecuteTheRecipe.WritePLC(name, true, null); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + ExecuteTheRecipe.WritePLC(name, false, null); + } + }, 500); + ToastUtils.info(name + "执行成功!"); + } + //endregion +} \ No newline at end of file diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/WokSetTLZZFragment.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/WokSetTLZZFragment.java index 91d31677..2fffe165 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/WokSetTLZZFragment.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/from/fragment/WokSetTLZZFragment.java @@ -81,9 +81,6 @@ public class WokSetTLZZFragment extends BaseFragment { TextView edit_fzz_wz3; @BindView(R.id.edit_fzz_wz4) TextView edit_fzz_wz4; - - @BindView(R.id.ctxh_button) - SwitchButton ctxh_button; //endregion //region 界面 @@ -149,7 +146,7 @@ public class WokSetTLZZFragment extends BaseFragment { public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { Log.e("鼠标", "按下: "); - ExecuteTheRecipe.WritePLC("平移-点动正转", true, null); + ExecuteTheRecipe.WritePLC("平移-点动反转", true, null); } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { Log.e("鼠标", "松开: "); ExecuteTheRecipe.WritePLC("平移-点动反转", false, null); @@ -177,7 +174,7 @@ public class WokSetTLZZFragment extends BaseFragment { public boolean onTouch(View view, MotionEvent motionEvent) { if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) { Log.e("鼠标", "按下: "); - ExecuteTheRecipe.WritePLC("翻转-点动正转", true, null); + ExecuteTheRecipe.WritePLC("翻转-点动反转", true, null); } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) { Log.e("鼠标", "松开: "); ExecuteTheRecipe.WritePLC("翻转-点动反转", false, null); @@ -185,15 +182,6 @@ public class WokSetTLZZFragment extends BaseFragment { return false; } }); - - ctxh_button.setOnCheckedChangeListener(new SwitchButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(SwitchButton view, boolean isChecked) { - boolean ischick = ctxh_button.isChecked(); - ExecuteTheRecipe.WritePLC("磁铁吸合", ischick, null); - ToastUtils.info("磁铁吸合!状态:" + (ischick ? "打开" : "关闭")); - } - }); } /** @@ -357,7 +345,7 @@ public class WokSetTLZZFragment extends BaseFragment { ButtomZhiWeiZhi("翻转-去4号位"); break; case R.id.dcqd_button: - ButtomZhiWeiZhi("倒菜启动"); + ButtomZhiWeiZhi("主料"); break; case R.id.pyz_savevalue: diff --git a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/add_qupenren.java b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/add_qupenren.java index e3d0dabd..66fa84da 100644 --- a/app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/add_qupenren.java +++ b/app/src/main/java/com/bonait/bnframework/modules/home/fragment/mode/add_qupenren.java @@ -146,17 +146,17 @@ public class add_qupenren extends LinearLayout { quzhizuo.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { - if (!ConfigName.getInstance().PlcIsConnect) { - ToastUtils.warning("PLC未准备就绪!!!"); - return; - } - - Object chushiover = ExecuteTheRecipe.getListingValue("初始化完成"); - //Object jiting = ExecuteTheRecipe.getListingValue("设备急停"); - if (chushiover == null || !(boolean) chushiover) { - ToastUtils.warning("设备未初始化,请先手动初始化设备!!!"); - return; - } +// if (!ConfigName.getInstance().PlcIsConnect) { +// ToastUtils.warning("PLC未准备就绪!!!"); +// return; +// } +// +// Object chushiover = ExecuteTheRecipe.getListingValue("初始化完成"); +// //Object jiting = ExecuteTheRecipe.getListingValue("设备急停"); +// if (chushiover == null || !(boolean) chushiover) { +// ToastUtils.warning("设备未初始化,请先手动初始化设备!!!"); +// return; +// } if (mListener != null) { mListener.clickListenerNew(view, 5, mode); } diff --git a/app/src/main/res/layout/fragment_system_systemset.xml b/app/src/main/res/layout/fragment_system_systemset.xml index b3d21e8f..c3e36454 100644 --- a/app/src/main/res/layout/fragment_system_systemset.xml +++ b/app/src/main/res/layout/fragment_system_systemset.xml @@ -42,6 +42,7 @@ android:padding="3dp" android:textSize="12dp" /> + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_wok_set_tlzz.xml b/app/src/main/res/layout/fragment_wok_set_tlzz.xml index a9b45440..c4bbeaf5 100644 --- a/app/src/main/res/layout/fragment_wok_set_tlzz.xml +++ b/app/src/main/res/layout/fragment_wok_set_tlzz.xml @@ -858,18 +858,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical"> - - +