翻转计数器
我正在为 Go 中的翻转计数器编写代码。每次来自 PLC 计数器的新值进来时都会访问该代码。当该值达到 32768 以上时,PLC 计数器重置为 1 并为翻转分配值 1。我需要编写一个可以计算数字的代码的重置并将这些重置存储在内存中,这样无论何时重新启动代码,重置的先前值都可用于计算。
计算公式如下:
总计数 = 计数 + 32768* 重置次数
更新:
我已经为翻转计数编写了以下代码,但是一旦翻转的值达到 1,总计数变为 132769 而不是 32768。 翻转计数器的值在 rollover.data 文件中存储为 1 但当它被访问它被提取为 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("%Tn", 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("%vn", totalcount)
if input2 == 32768 {
t := strconv.Itoa(rollovervalue + 1)
mydata := []byte(t)
err := ioutil.WriteFile("rollover.data", mydata, 0777)
if err != nil {
// print it out
fmt.Println(err)
}
}
}
,,,
回答
当进程退出时,变量的内容将丢失。
您需要一种在进程退出时保留翻转计数器的方法。有很多方法可以实现这一点:
- 创建一个文件,并在文件更改时将值写入文件。在程序启动时,读取文件(如果存在)。
- 使用某种数据库(SQL 数据库,如 MySQL、SQLite、Redis 等)。