我发现使用modbus读取64个连续内存位置(元素)是使用rmodbus库通过Modbus检索信息的最有效方法。将Modbus记录器插入数据库和阵列处理策略
我的目标是将读取的信息记录在一个简单的数据库中,该数据库可以被挖掘以在网页上生成数据图表和表格,并将最新值存储在实例变量中。
数据被rmodbus库读入数组,其中每个元素的索引代表元素的地址。但是,我想将索引转换为八进制,因为这与用户已经熟悉的元素寻址方案相对应,并且在界面中更容易引用。
编辑添加细节和细化:在这个时间点,我用下面的模式工作:
create_table "elements", :force => true do |t|
t.string "name"
t.integer "modbus_connection_id"
t.string "address"
t.string "eng_unit"
t.integer "base"
t.string "wiring"
t.text "note"
t.boolean "log"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "events", :force => true do |t|
t.integer "element_id"
t.string "value"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "modbus_connections", :force => true do |t|
t.string "name"
t.string "ip_address"
t.integer "port"
t.integer "client"
t.text "note"
t.datetime "created_at"
t.datetime "updated_at"
end
的想法将是一个后台进程可能会轮询通过Modbus和比较在仅记录已更改且被要求记录的元素之前针对其自身进行更改。元素应该可以存储在数据库和变量已经缩放,所以前端不必担心它。未记录的那些仍然保存在实例变量中,用于半实时抬头显示类型监视。然后,只有在UI请求时,才会为其图表和表格中的记录元素进行解析。
第一个问题:(最后!)它使更多的意义与数据生活在一个阵列和应用,处理转换指数层,(和它发生相应的元素值,以及我用v.collect{|i| i.to_s(16)}
转换)还是更好地将所有内容都转换成哈希表,索引和值可以以最有用的形式永远幸福地生活在一起?
首先问编辑:鉴于我对采伐问题唯一变化的数据到一个简单的SQLite数据库的判定/演变,我需要跟踪的元素的变化,以确定哪些MODBUS之间改变读取,数组或哈希是否更有效地进行比较?我应该关心吗?
第二个问题:在Rails中,假设一分钟记录间隔,将大约一千个数据点可以更好地在独立的领域举行的,或者我应该留在他们64元块和解析的道路上的信息,界面?
第二个问题编辑:将大量未改变的数据运行到数据库的一分钟'行'看起来非常平坦。另外,它不允许轻松动态选择要记录的元素。使“记录器”事件基于而不是基于间隔为基础似乎更为合适。这很好,意味着第一个问题在这里更重要,因为它也可能成为国家检查机制。
我在猜测我不必要地重新发明了一个带有这种启示的轮子,因为它变得和现有的“伐木工”非常相似。对SO进行阅读显示,登录DB和FS是一个古老的问题。由于日志本身是应用程序的基础,因此我倾向于登录到数据库,最有可能的情况是给出了我读过的sqlite。
第二个问题再次编辑:现在这是一个规范化问题,我读的所有内容都表明“可伸缩性”往往需要非规范化。我记录的“Events”表格将会相对简单,时间戳,值和元素ID。它是否也可以从Elements表内反规格化最常见的属性,或者在这个相对较小的范围内是否可以连接?
任何人都有任何最喜欢的Ruby日志框架/宝石/捆绑/插件/什么?
看起来好像我正在想办法在这里“平坦”。我会适当地编辑问题。 – arriflex 2010-08-08 18:20:34
好的,既然我提出的问题已经在别处得到解答,或者我已经为自己找到了答案,我将完全改变第二个问题。 – arriflex 2010-08-15 04:05:19
这开始变得比我预想的更笨重一点。我认为是时候学习如何使用GIT,这样我就可以实现更少的破坏性实验了! – arriflex 2010-08-15 22:02:39