Переглянути джерело

1. 开关量读写测试
2. 调节485通信速度,过快导致读取寄存器状态异常

bjb 4 місяців тому
батько
коміт
520bfc88f8

+ 12 - 12
app/src/main/java/com/grkj/iscs_mars/BusinessManager.kt

@@ -64,7 +64,6 @@ import com.grkj.iscs_mars.model.vo.lock.LockPageRespVO
 import com.grkj.iscs_mars.model.vo.lock.LockTakeUpdateReqVO
 import com.grkj.iscs_mars.model.vo.ticket.LockPointUpdateReqVO
 import com.grkj.iscs_mars.model.vo.ticket.TicketDetailRespVO
-import com.grkj.iscs_mars.service.CheckKeyInfoTask
 import com.grkj.iscs_mars.util.ActivityUtils
 import com.grkj.iscs_mars.util.CommonUtils
 import com.grkj.iscs_mars.util.Executor
@@ -77,7 +76,6 @@ import com.grkj.iscs_mars.view.base.BaseActivity
 import com.grkj.iscs_mars.view.dialog.TipDialog
 import com.huyuhui.fastble.data.BleDevice
 import com.huyuhui.fastble.exception.BleException
-import com.sik.cronjob.managers.CronJobScanner
 import com.sik.sikandroid.activity.ActivityTracker
 import com.sik.sikcore.SIKCore
 import com.sik.sikcore.date.TimeUtils
@@ -232,22 +230,24 @@ object BusinessManager {
                 MSG_EVENT_SWITCH_COLLECTION_UPDATE -> {
                     ThreadUtils.runOnIO {
                         val lotoSerialNumber = SIKCore.getApplication().serialNo()
-                        val switchListReqVOS = ModBusController.getSwitchData().map {
+                        val sb = StringBuffer(" -> ")
+                        var idx = 0
+                        val switchListReqVOS = ModBusController.getSwitchData().map { sw ->
+                            sb.append(if (sw.enabled) "1" else "0")
+                            // 4的整数倍需要分割
+                            if ((idx + 1) % 4 == 0) sb.append(" ")
+                            idx++
                             SwitchListReqVO(
                                 lotoSerialNumber,
-                                it.idx.toString(),
-                                if (it.enabled) "1" else "0",
+                                sw.idx.toString(),
+                                if (sw.enabled) "1" else "0",
                                 TimeUtils.nowString(TimeUtils.DEFAULT_DATE_HOUR_MIN_SEC_FORMAT)
                             )
                         }
-                        NetApi.updateSwitchList(switchListReqVOS) {
+                        LogUtil.d("开关量 开关状态$sb")
+                        NetApi.updateSwitchList(switchListReqVOS) { rsp ->
                             LogUtil.d("开关更新完成")
-                            sendEventMsg(
-                                MsgEvent(
-                                    MsgEventConstants.MSG_EVENT_SWITCH_COLLECTION_UPDATE_RESULT,
-                                    it
-                                )
-                            )
+                            sendEventMsg(MsgEvent(MsgEventConstants.MSG_EVENT_SWITCH_COLLECTION_UPDATE_RESULT, rsp))
                         }
                     }
                 }

+ 42 - 61
app/src/main/java/com/grkj/iscs_mars/modbus/DockBean.kt

@@ -4,6 +4,7 @@ import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.grkj.iscs_mars.BusinessManager
 import com.grkj.iscs_mars.MyApplication
+import com.grkj.iscs_mars.extentions.toHexStrings
 import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_CARD
 import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_FINGERPRINT
 import com.grkj.iscs_mars.model.DeviceConst.DEVICE_TYPE_KEY
@@ -243,7 +244,7 @@ class DockBean(
 
                 DOCK_TYPE_COLLECT -> {
                     val working = (byteArray[4].toInt() shr 0) and 0x1 == 1
-                    LogUtil.d("开关量采集板是否工作 : $working")
+                    if (!working) LogUtil.d("开关量 采集板工作异常")
                     return DockBean(
                         addr,
                         dockConfig.find { it.address == addr }?.row?.toInt() ?: 0,
@@ -386,69 +387,49 @@ class DockBean(
      * 转换开关状态
      */
     fun parseSwitchStatus(byteArray: ByteArray, done: () -> Unit): DockBean? {
-        if (byteArray.isEmpty()) {
-            return null
-        }
-        type?.let {
-            // 因为都是一个寄存器返回的,所以一定能得到2个钥匙的状态或者10把锁具的状态
-            when (it) {
-                DOCK_TYPE_COLLECT -> {
-                    val remainTimes = AtomicInteger(0)
-                    for (i in 0 until byteArray[4].toInt()) {
-                        val switchBoardAddr = byteArrayOf(0x00, (0x20 + i).toByte())
-                        ModBusController.readSwitchStatus(addr, switchBoardAddr) { res ->
-                            val switchStatus: MutableList<Boolean> = mutableListOf()
-                            for (switchIdx in 0..7) {
-                                switchStatus.add((res[4].toInt() shr switchIdx) and 0x1 == 1)
-                            }
-                            for (switchIdx in 0..7) {
-                                switchStatus.add((res[3].toInt() shr switchIdx) and 0x1 == 1)
-                            }
-                            for (idx in 0 until switchStatus.size) {
-                                deviceList.filterIsInstance<SwitchBean>()
-                                    .find { it.switchBoardAddr == switchBoardAddr[1] && it.idx == idx }
-                                    ?.let {
-                                        if (it.enabled != switchStatus[idx]) {
-                                            it.enabled =
-                                                switchStatus[idx]
-                                            it.changed = true
-                                        }
-                                    } ?: run {
-                                    deviceList.add(
-                                        SwitchBean(
-                                            idx,
-                                            switchBoardAddr[1],
-                                            switchStatus[idx],
-                                            changed = true
-                                        )
-                                    )
-                                }
-                            }
-                            remainTimes.addAndGet(1)
-                            if (remainTimes.get() == byteArray[4].toInt()) {
-                                BusinessManager.sendEventMsg(
-                                    MsgEvent(
-                                        MSG_EVENT_SWITCH_COLLECTION_UPDATE,
-                                        null
-                                    )
-                                )
-                                done()
-                            }
+        if (byteArray.isEmpty() || type == null) return null
+        if (type != DOCK_TYPE_COLLECT) return null
+        // 处理开关量采集操作
+        val remainTimes = AtomicInteger(0)
+        val swModuleCount = byteArray[4].toInt()
+        LogUtil.d("开关量 模块总数 -> $swModuleCount")
+        for (i in 0 until swModuleCount) {
+            // 开关模块索引地址
+            val swModuleIdx = byteArrayOf(0x00, (0x20 + i).toByte())
+            ModBusController.readSwitchStatus(addr, swModuleIdx) { res ->
+                LogUtil.d("开关量 读${byteArrayOf(swModuleIdx[1]).toHexStrings(false)}数据 -> ${res.toHexStrings()}")
+                val switchStatus: MutableList<Boolean> = mutableListOf()
+                for (switchIdx in 0..7) {
+                    switchStatus.add((res[4].toInt() shr switchIdx) and 0x1 == 1)
+                }
+                for (switchIdx in 0..7) {
+                    switchStatus.add((res[3].toInt() shr switchIdx) and 0x1 == 1)
+                }
+                for (idx in 0 until switchStatus.size) {
+                    deviceList.filterIsInstance<SwitchBean>().find { it.switchBoardAddr == swModuleIdx[1] && it.idx == idx }?.let {
+                        if (it.enabled != switchStatus[idx]) {
+                            it.enabled = switchStatus[idx]
+                            it.changed = true
                         }
+                    } ?: run {
+                        deviceList.add(SwitchBean(idx, swModuleIdx[1], switchStatus[idx], changed = true))
                     }
-                    return DockBean(
-                        addr,
-                        dockConfig.find { it.address == addr }?.row?.toInt() ?: 0,
-                        dockConfig.find { it.address == addr }?.column?.toInt() ?: 0,
-                        type,
-                        isWorking,
-                        deviceList
-                    )
                 }
-
-                else -> return null
+                remainTimes.addAndGet(1)
+                if (remainTimes.get() == byteArray[4].toInt()) {
+                    BusinessManager.sendEventMsg(MsgEvent(MSG_EVENT_SWITCH_COLLECTION_UPDATE, null))
+                    done()
+                }
             }
-        } ?: return null
+        }
+        return DockBean(
+            addr,
+            dockConfig.find { it.address == addr }?.row?.toInt() ?: 0,
+            dockConfig.find { it.address == addr }?.column?.toInt() ?: 0,
+            type,
+            isWorking,
+            deviceList
+        )
     }
 
     /**
@@ -558,7 +539,7 @@ class DockBean(
     /**
      * 钥匙
      */
-    // TODO isLeft待移除,使用idx替代
+// TODO isLeft待移除,使用idx替代
     class KeyBean(
         idx: Int,
         isExist: Boolean,

+ 1 - 1
app/src/main/java/com/grkj/iscs_mars/modbus/FrameTask.kt

@@ -30,7 +30,7 @@ class FrameTask(
     /**
      * 摘出发送间隔等待时间为50ms
      */
-    var sendSpace = 50_000_000
+    var sendSpace = 100_000_000
 
     fun waitIfNecessary() {
         val interval = System.nanoTime() - lastSent

+ 10 - 0
app/src/main/java/com/grkj/iscs_mars/modbus/ModBusCMDHelper.kt

@@ -188,4 +188,14 @@ object ModBusCMDHelper {
             byteArrayOf(addr[0], addr[1], 0x00, 0x01)
         )
     }
+
+    /**
+     * 生成读取开关采集板模块总数的指令
+     */
+    fun generateSwitchBoardModuleCountCmd(addr: ByteArray): MBFrame {
+        return MBFrame(
+            FRAME_TYPE_READ,
+            byteArrayOf(addr[0], addr[1], 0x00, 0x01)
+        )
+    }
 }

+ 24 - 14
app/src/main/java/com/grkj/iscs_mars/modbus/ModBusController.kt

@@ -150,8 +150,9 @@ object ModBusController {
         readDeviceType { res ->
             res.forEach { bytes ->
                 if (bytes.size < 5) return@forEach
+                val addr = bytes[0]
                 // 设备具体数据由0x0011寄存器提供
-                updateDeviceType(bytes[0], bytes[4])
+                updateDeviceType(addr, bytes[4])
                 val type = when (bytes[4]) {
                     DOCK_TYPE_KEY -> "钥匙底座"
                     DOCK_TYPE_LOCK -> "锁具底座"
@@ -160,7 +161,7 @@ object ModBusController {
                     DOCK_TYPE_COLLECT -> "开关量采集板"
                     else -> "未知"
                 }
-                LogUtil.i("initDevicesStatus 设备(${bytes[0].toInt()})类型:$type")
+                LogUtil.i("initDevicesStatus 设备地址:${byteArrayOf(addr).toHexStrings()}\t类型:$type")
             }
             //先打开所有钥匙仓位,再进行初始化,防止一开始锁仓没有钥匙,但是锁定状态下会出现状态锁定
             controlAllKeyBuckleClose()
@@ -355,7 +356,7 @@ object ModBusController {
      * 开关量更新
      */
     fun switchStatus(res: Any, done: () -> Unit) {
-        LogUtil.d("开关板:${(res as ByteArray).toHexStrings()}")
+         LogUtil.d("开关量 查询状态 -> ${(res as ByteArray).toHexStrings()}")
         if (res.isEmpty()) {
             var tipStr = CommonUtils.getStr(R.string.no_response_board_exists) + " : "
             val addressList = mutableListOf<String>()
@@ -368,7 +369,10 @@ object ModBusController {
             tipStr += addressList
             ToastUtils.tip(tipStr)
         }
-        updateSwitchStatus(res, done)
+        // 读取当前模块总数
+        readSwitchModuleCount(0xA1.toByte(), byteArrayOf(0x00, 0x11)) { res ->
+            updateSwitchStatus(res, done)
+        }
     }
 
     /**
@@ -397,18 +401,13 @@ object ModBusController {
             when (dockBean.type) {
                 DOCK_TYPE_KEY -> {
                     dockBean.getKeyList().forEach { keyBean ->
-                        updateKeyLockStatus(
-                            dockBean.addr, keyBean.isLeft, keyBean.lockEnabled
-                        )
-                        //todo 更新锁仓状态
+                        updateKeyLockStatus(dockBean.addr, keyBean.isLeft, keyBean.lockEnabled)
                     }
                 }
 
                 DOCK_TYPE_LOCK -> {
                     dockBean.getLockList().forEach { lockBean ->
-                        updateLockStatus(
-                            dockBean.addr, lockBean.idx, lockBean.lockEnabled
-                        )
+                        updateLockStatus(dockBean.addr, lockBean.idx, lockBean.lockEnabled)
                     }
                 }
 
@@ -1229,9 +1228,7 @@ object ModBusController {
     /**
      * 读取开关采集板数据
      */
-    fun readSwitchStatus(
-        slaveAddress: Byte?, addr: ByteArray, done: ((res: ByteArray) -> Unit)? = null
-    ) {
+    fun readSwitchStatus(slaveAddress: Byte?, addr: ByteArray, done: ((res: ByteArray) -> Unit)? = null) {
         slaveAddress?.let {
             ModBusCMDHelper.generateSwitchBoardStatusCmd(addr)?.let { cmd ->
                 modBusManager?.sendTo(it, cmd) { res ->
@@ -1241,6 +1238,19 @@ object ModBusController {
         }
     }
 
+    /**
+     * 读取开关量模块个数
+     */
+    fun readSwitchModuleCount(slaveAddress: Byte?, addr: ByteArray, done: ((res: ByteArray) -> Unit)? = null) {
+        slaveAddress?.let { ch ->
+            ModBusCMDHelper.generateSwitchBoardModuleCountCmd(addr).let { cmd ->
+                modBusManager?.sendTo(ch, cmd) {
+                    done?.invoke(it)
+                }
+            }
+        }
+    }
+
     /**
      * 更新钥匙电量
      */

+ 8 - 1
app/src/main/java/com/grkj/iscs_mars/modbus/ModBusManager.kt

@@ -1,5 +1,6 @@
 package com.grkj.iscs_mars.modbus
 
+import android.util.Log
 import com.google.gson.Gson
 import com.google.gson.reflect.TypeToken
 import com.grkj.iscs_mars.MyApplication
@@ -8,8 +9,12 @@ import com.grkj.iscs_mars.util.Executor
 import com.grkj.iscs_mars.util.SPUtils
 import com.grkj.iscs_mars.util.log.LogUtil
 import com.grkj.iscs_mars.view.fragment.DockTestFragment
-import kotlinx.coroutines.*
+import kotlinx.coroutines.CancellationException
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
 import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.launch
 
 /**
  * ModBus 协议管理器(协程版)
@@ -42,6 +47,7 @@ class ModBusManager(
     init {
         // 串口监听,回调在单独线程中执行
         portManager?.listen { res ->
+            LogUtil.d("MODBUS Back <- ${res.toHexStrings()}")
             if (verbose) LogUtil.i("接收:${res.toHexStrings()}")
             synchronized(lock) {
                 sending?.run {
@@ -81,6 +87,7 @@ class ModBusManager(
                 if (shouldSend()) {
                     if (portManager?.send(req) == true) {
                         afterSent()
+                        LogUtil.d("MODBUS Send -> ${req.toHexStrings()}")
                         if (verbose) LogUtil.i("发送:${req.toHexStrings()}")
                     } else {
                         LogUtil.w("无法与主控板通讯")