微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

翻转计数器

如何解决翻转计数器

我正在为 Go 中的翻转计数器编写代码。每次来自 PLC 计数器的新值进来时都会访问该代码。当该值达到 32768 以上时,PLC 计数器重置为 1 并为翻转分配值 1。我需要编写一个可以计算数字的代码重置的次数并将这些重置存储在内存中,这样无论何时重新启动代码,重置的先前值都可用于计算。

计算公式如下:

总计数 = 计数 + 32768*重置次数

更新: 我已经为翻转计数编写了以下代码,但是一旦翻转的值达到 1,总计数变为 132769 而不是 32768。 翻转计数器的值被存储为 1 rollover.data 文件,但当它被访问时,它被提取为 11。

input1 和 input2 基本上是来自 PLC 计数器在 2 个事件计数窗口中的连续值。例如初始值将是 input1 = 0 input2 = 0 然后 (input2 = 1,input1 =0),(input2 = 2,input1 =1) 等等。所以当 input2 = 32768 时,翻转的值应该递增 1。在此值之后,PLC 计数器重置为 1。

package main
   

import (
    "fmt"
    "io/IoUtil"
    "strconv"
)

func main() {
    var input1 int = 32768
    var input2 int = 1

    if input1 == 0 {

        t := strconv.Itoa(0)
        mydata := []byte(t)
        recordfile := []byte(t)

        // the WriteFile method returns an error if unsuccessful
        err := IoUtil.WriteFile("rollover.data",mydata,0777)
        // handle this error
        if err != nil {
            // print it out
            fmt.Println(err)
        }
        err2 := IoUtil.WriteFile("record.data",recordfile,0777)
        // handle this error
        if err2 != nil {
            // print it out
            fmt.Println(err2)
        }
    }

    rollover,err := IoUtil.ReadFile("rollover.data")
    fmt.Printf("%T\n",rollover)

    if err != nil {
        fmt.Println(err)
    }

    rollovervalue,err3 := strconv.Atoi(string(rollover))

    if err3 == nil {
        fmt.Printf("%T \n %v",rollovervalue,rollovervalue)
    }

    //fmt.Printf("%T",rollovervalue)
    totalcount := input2 + rollovervalue*32768

    fmt.Printf("%v\n",totalcount)

    if input2 == 32768 {
        
        t := strconv.Itoa(rollovervalue + 1)
        mydata := []byte(t)
        err := IoUtil.WriteFile("rollover.data",0777)
       
        if err != nil {
            // print it out
            fmt.Println(err)
        }

    }

}

,

解决方法

进程退出时变量的内容丢失。

您需要一种在进程退出时保持翻转计数器的方法。有很多方法可以实现这一点:

  • 创建一个文件,并在文件发生变化时将值写入文件。在程序启动时,读取文件(如果存在)。
  • 使用某种数据库(SQL 数据库,如 MySQL、SQLite、Redis 等)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?