RS485计数器
# PinToo之RS485计数器
# 1. 说明
范例采用RS485接口,通过ModbusRTU通讯协议,读取计数器数据并控制数据显示。使用Modbus协议进行计数器数值的读取,并且写入数值0以达到清零的效果。
范例使用到的计数器为FC304N-R计数器,该计数器通过RS485协议与手机端进行连接通信。配合该计数器使用到的配件包含USB-485转换器,金属接近开关传感器,电源线缆,通信线缆。计数器的220V接口与220V电源连接,12V+,12V-与IN1分别与金属接近开关的正极(棕色线)、负极(蓝色线)、信号极(黑色)相连。计数器的485A、485B接口分别与USB-485的正极,负极相连。USB-485转换器在连接至计算机时会被识别为串口,请记住该串口的端口号,在接下来的配置过程中会使用到该端口号。
通过范例学习,可以掌握ModbusRTU的基本通讯原理,并通过RS485进行计数器的读取与控制功能。
# 2. 设计明细
开启PinToo设计器,分别加入下插图之控件。或者点击左上角的[打开模板Lib文件]选择模板文件来打开对应模板。

①:TfxImage组件,控件名称为fxImageSearch。
②:TfxText组件,控件名称为fxTextStatus。
③:TfxImage组件,控件名称为fxImageConnect。
④:TfxWidgetLCDLabel组件,控件名称为fxWidgetLCDLabel1。
⑤:TfxNumberBox组件,控件名称为fxNumberBox1。
⑥:TfxText组件,控件名称为fxTextWrite。
⑦:TfxUsbSerial组件,控件名称为fxUsbSerial。
fxRunFrame属性设置
Height:设置页面高度=800。Width:设置页面宽度=400。
fxComboBox属性设置
Visible:是否显示该复选框,此处选择False。Name:设置控件名称=fxComboBox。
fxTimer1属性设置
Enabled:是否启用计时器,设置为False。Interval:设置计时器间隔(ms),设置为300ms。
①fxImageSearch属性设置
Height:设置控件高度=40。Width:设置控件宽度=40。Name:设置控件名称=fxImageSearch。WarpMode:设置图像在控件中显示的模式,设置为Fit,即图像适应于控件大小。Bitmap:设置显示的图片,双击该属性或者点击属性右侧的[...]打开图像编辑器。点击[Load...]打开资源管理器,选择所需的图片后点击[打开],选择的图像会显示在预览框中。可在该页面下进行裁切或者缩放像素以使图像与控件的宽度高度相适应,修改完成后点击[OK]按钮完成图像修改。

②fxTextStatus属性设置
Text:设置显示文字=等待连接。Height:设置控件高度=40。Width:设置控件宽度=280。Name:设置控件名称=fxTextStatus。TextSettings:设置文字字体的相关信息。设置Font.Size=18。FontColor=White。HorzAlign:设置文字在控件中的水平位置=Center。VertAlign:设置文字在控件中的垂直位置=Center。
③fxWidgetLCDLabel1属性设置
Height:设置控件高度=110。Width:设置控件宽度=360。
④fxImageConnnect属性设置
Height:设置控件高度=40。Width:设置控件宽度=40。Name:设置控件名称=fxImageConnect。WarpMode:设置图像在控件中显示的模式,设置为Fit,即图像适应于控件大小。Bitmap:设置显示的图片,双击该属性或者点击属性右侧的[...]打开图像编辑器。点击[Load...]打开资源管理器,选择所需的图片后点击[打开],选择的图像会显示在预览框中。可在该页面下进行裁切或者缩放像素以使图像与控件的宽度高度相适应,修改完成后点击[OK]按钮完成图像修改。

⑤fxNumebrBox1属性设置
Height:设置控件高度=50。Width:设置控件宽度=100。
⑥fxTextWrite属性设置
Height:设置控件高度=80。Width:设置控件宽度=80。TextSettings:文本样式设置,Font.Size=24,Font.Style中勾选fsBold。Text:设置显示的文本内容=写入。
⑦fxUsbSerial属性设置
UsbSerialType:串口通讯类型,此处选择RS485。Info:是否显示调试信息,进行调试操作时可用。
# 3. 程序设计
点击程序设计界面右下角的按钮,切换至单元选择界面,勾选需要使用的单元。该程序需要引用uUSBSerial单元。
# 3.1. 程序初始设置
程序启动时,数字仪表盘中非填充部分的内容设置为透明,并设置默认的数字显示格式。
Begin
fxWidgetLCDLabel1.Caption.FillOff.Color := NULL;
fxWidgetLCDLabel1.Caption.Format := '00000';
End.
2
3
4
# 3.2. 事件设置
- ①fxImageSearch-OnClick事件
点击搜索按钮,加载设备列表并弹出显示在下拉列表框中。
Procedure fxImageSearchOnClick(Sender: TObject);
//点击搜索按钮寻找端口
Begin
if fxUsbSerial.Devices.Text = '' Then
begin
fxTextStatus.Text := '请检查串口是否连接';
Exit;
End;
fxComboBox.Items := fxUsbSerial.Devices;
fxComboBox.DropDown;
End;
2
3
4
5
6
7
8
9
10
11
- fxComboBox-OnChange事件
点击切换端口,并显示。
Procedure fxComboBoxOnChange(Sender: TObject);
Begin
fxUsbSerial.UsbDevice := fxComboBox.Items.Strings[fxComboBox.ItemIndex];
fxTextStatus.Text := '已选择端口';
End;
2
3
4
5
- ④fxImageConnect-OnClick事件
当点击连接按钮后,开启串口连接并启用计时器。
Procedure fxImageConnectOnClick(Sender: TObject);
//连接
Begin
fxUsbSerial.Open(True);
if fxUsbSerial.Devices.Text <> '' Then
begin
fxTextStatus.Text := '计数器已连接';
fxTimer1.Enabled := True;
End;
End;
2
3
4
5
6
7
8
9
10
- fxTimer1-OnTimer事件
当计时器触发时,读取计数器中的保持寄存器数据。
Procedure fxTimer1OnTimer(Sender: TObject);
//连续读取
Begin
fxUsbSerial.ReadHoldingRegisters(1,0,10);
End;
2
3
4
5
- ⑦fxUsbSerial-OnReadHoldingRegisters事件
当读取保持寄存器数据时返回数据解析显示在仪表中。
Procedure fxUsbSerialOnReadHoldingRegisters(Sender: TObject; ReceiveData: string; UserData: string);
//返回数值
var
s:Tstrings;
Begin
s := TStringlist.Create;
s.CommaText := UserData;
if s.Count=10 Then
begin
fxWidgetLCDLabel1.Caption.Value := StrToInt(s[1]);
End;
End;
2
3
4
5
6
7
8
9
10
11
12
- ⑥fxTextWrite-OnClick事件
点击[写入]按钮,执行写入多个保持寄存器命令,将计数器的数值修改为数值编辑框中的值。
Procedure fxTextWriteOnClick(Sender: TObject);
Begin
fxUsbSerial.WriteMultipleRegisters(1,1,1,fxNumberBox1.Text);
End;
2
3
4
# 4. 运行结果
使用鼠标在 PinToo 菜单,点击[保存至数据库]按钮,将其保存至数据库,点击[调试运行]确认能够正常打开。

通过同步中心,将程序上传至手机PinToo运行;同步时,请确保手机已经运行PinToo,并且已经登陆。

将计数器连接好后,USB转485模块的USB端与手机的USB端连接。打开程序,点击[搜索]按钮获取串口设备列表,在弹出的下拉框中选择对应的设备名称,然后点击右侧的[连接]按钮开启连接,通过触动金属接近开关,计数器的数值发生变化,手机端的数字仪表显示的值也会对应发生变化。编辑数字框中的数字(例如设定为0,则将计数器清零),点击下方的写入按钮,计数器的值会变为0,同时手机上显示的数值也会变为0。