硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1989|回复: 4
收起左侧

Go 语言 跨平台上位机编程 或许是嵌入式工程师 一个新选择 - 附 demo modbus_rtu 小栗子

[复制链接]

31

主题

208

回帖

301

积分

高级会员

积分
301
发表于 2021-3-18 15:56:59 | 显示全部楼层 |阅读模式


modbus_rw
package main

import (
        "fmt"
        "log"
        "os"
        "runtime"
        "github.com/goburrow/modbus"
)

var handler *modbus.RTUClientHandler

var client modbus.Client

var Modbus_DI8_DO8_SlaveId byte

func Modbus_init() int {

        var rtuDevice = ""
        sysType := runtime.GOOS
        if sysType == "windows" {
                rtuDevice = "COM1"
        }
        if sysType == "linux" {
                rtuDevice = "/dev/ttyUSB0"
        }
        fmt.Printf("rtuDevice= %v \n", rtuDevice)

        handler = modbus.NewRTUClientHandler(rtuDevice)
        handler.BaudRate = 19200
        handler.DataBits = 8
        handler.Parity = "E"
        handler.StopBits = 1
        handler.SlaveId = 2
        handler.Logger = log.New(os.Stdout, "rtu: ", log.LstdFlags)
        err := handler.Connect()
        if err != nil {
                fmt.Printf("%v\n", err)
        }
        defer handler.Close()
        client = modbus.NewClient(handler)
        return 0
}

var Read_DO []byte

func Set_DO_Valves(Output_D byte) {

        fmt.Printf("WriteMultipleCoils...... ")
        results, err := client.WriteMultipleCoils(0, 8, []byte{Output_D})
        if err != nil || results == nil {
                fmt.Printf("%v\n", err)
        }
        fmt.Printf("WriteMultipleCoils results %v\n", results)

        fmt.Printf("ReadCoils ......  \n")
        results, err = client.ReadCoils(0, 8)
        if err != nil || results == nil {
                fmt.Printf("%v\n", err)
        }
        //        fmt.Printf("ReadCoils results %v\n", results)

        if results != nil {
                Read_DO = results
                fmt.Printf(" ReadCoils %v\n", Read_DO)
        }
}

main.go
package main

import (
        //        "fmt"
        //        "os"
        "time"
)

func main() {

        var Output_DO byte
        Output_DO = 1
        Modbus_init()
        Set_DO_Valves(0)
        go func() {
                for {
                        time.Sleep(time.Millisecond * 1000)
                        Set_DO_Valves(Output_DO)
                        Output_DO++
                }
        }()
        for {
        }
}
运行输出结果

rtuDevice= COM1
WriteMultipleCoils...... rtu: 2021/03/18 11:58:16 modbus: sending 02 0f 00 00 00 08 01 00 be 80
rtu: 2021/03/18 11:58:16 modbus: received 02 0f 00 00 00 08 54 3e
WriteMultipleCoils results [0 8]
ReadCoils ......
rtu: 2021/03/18 11:58:16 modbus: sending 02 01 00 00 00 08 3d ff
rtu: 2021/03/18 11:58:16 modbus: received 02 01 01 00 51 cc
ReadCoils [0]
WriteMultipleCoils...... rtu: 2021/03/18 11:58:17 modbus: sending 02 0f 00 00 00 08 01 01 7f 40
rtu: 2021/03/18 11:58:17 modbus: received 02 0f 00 00 00 08 54 3e
WriteMultipleCoils results [0 8]
ReadCoils ......
rtu: 2021/03/18 11:58:17 modbus: sending 02 01 00 00 00 08 3d ff
rtu: 2021/03/18 11:58:17 modbus: received 02 01 01 01 90 0c
ReadCoils [1]


回复

使用道具 举报

31

主题

208

回帖

301

积分

高级会员

积分
301
 楼主| 发表于 2021-3-27 13:08:18 | 显示全部楼层
得益于 Go 语言 与生俱来的跨平台交叉编译 ,生成极少依赖的 单一可执行文件的优势 ,
上述  例程 编译成 各种 Windows 和  linux (X86 或 arm ) 平台 的  32 位程序 , 直接拷贝 到 系统下 直接运行。
是不是很爽。

已经 亲试  编程成  WIN32 版本  , 在 win7 32, 64   win10   64 位下 可运行。
交叉编译成  cross-linux32 版本 ,直接拷贝 到 系统下 ,在 luntun 20.04   ubuntu 18.04   ubuntu 14.04   可运行。

如果编程成  cross-arm linux 版本 应该在  arm linux 下可以运行, 例如  树莓派。(手头没有 无法测试) 。
回复

使用道具 举报

31

主题

208

回帖

301

积分

高级会员

积分
301
 楼主| 发表于 2021-3-27 13:18:49 | 显示全部楼层
搭建    快捷的  Go 开发环境
Go 语言环境安装
https://golang.google.cn/dl/
https://golang.google.cn/dl/go1.16.2.windows-amd64.msi
https://golang.google.cn/dl/go1.16.2.linux-amd64.tar.gz

Go 语言集成开发环境  
LiteIDE 是一款开源、跨平台的轻量级 Go 语言集成开发环境(IDE)。
支持的 操作系统
    Windows x86 (32-bit or 64-bit)
    Linux x86 (32-bit or 64-bit)

下载地址 :http://sourceforge.net/projects/liteide/files/
源码地址 :https://github.com/visualfc/liteide

Go 语言教程
https://www.runoob.com/go/go-tutorial.html

Go 语言中文社区   
https://www.douban.com/group/topic/9766700/







回复

使用道具 举报

31

主题

208

回帖

301

积分

高级会员

积分
301
 楼主| 发表于 2021-3-27 13:55:29 | 显示全部楼层
各平台的GOOS和GOARCH支持情况

GOOS                GOARCH                       OS version

linux                  386 / amd64 / arm        >= Linux 2.6

darwin               386 / amd64                OS X (Snow Leopard + Lion)

freebsd              386 / amd64              >= FreeBSD 7

windows            386 / amd64           >= Windows 2000
回复

使用道具 举报

31

主题

208

回帖

301

积分

高级会员

积分
301
 楼主| 发表于 2021-3-27 14:51:15 | 显示全部楼层
demo modbus_rtu 例程需要 导入modbus包
github.com/goburrow/modbu

github.com/thinkgos/gomodbus

这二个 包 都支持
Bit access:

    Read Discrete Inputs
    Read Coils
    Write Single Coil
    Write Multiple Coils

16-bit access:

    Read Input Registers
    Read Holding Registers
    Write Single Register
    Write Multiple Registers
    Read/Write Multiple Registers
    Mask Write Register
    Read FIFO Queue

Supported formats

    TCP
    Serial (RTU, ASCII)





回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-3 16:58 , Processed in 0.249100 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表