|
楼主 |
发表于 2013-12-5 11:55:47
|
显示全部楼层
本帖最后由 oldbeginner 于 2013-12-5 12:04 编辑
继续模拟量寄存器的读写功能,
首先,读模拟量寄存器03,定义如下
<3>起始地址高8位、低8位:表示想读取的模拟量的起始地址(起始地址为0)。比如例子中的起始地址为0。<4>寄存器数高8位、低8位:表示从起始地址开始读多少个模拟量。例子中为3个模拟量。注意,在返回的信息中一个模拟量需要返回两个字节。
相应从机收到后,作出响应
//读寄存器
void readRegisters(void)
{
读取地址判断();
读取个数判断();
把个数转为字节数();
读取寄存器状态();
生成报文并发送();
}
和读线圈是一个模子里出来的,只是改成了读寄存器。
读取地址判断();
//addr = (receBuf[2]<<8) + receBuf[3];
//tempAddr = addr & 0xfff;
addr = receBuf[3];
tempAddr = addr;
这里的地址只取了低8位,高8位被忽略。这是因为本程序没有高8位的需求而简化,
并且有注释:
//字地址 0 - 255 (只取低8位)
//位地址 0 - 255 (只取低8位)
读取个数判断();
readCount = receBuf[5];
把个数转为字节数();
byteCount = readCount * 2;
每个寄存器的数据占两个字节。
读取寄存器状态();
for (i = 0; i < byteCount; i += 2, tempAddr++) {
getRegisterVal(tempAddr, &tempData);
sendBuf[i+3] = tempData >> 8;
sendBuf[i+4] = tempData & 0xff;
}
调用了getRegisterVal函数来读取。
生成报文并发送();
sendBuf[0] = localAddr;
sendBuf[1] = 3;
sendBuf[2] = byteCount;
byteCount += 3;
crcData = crc16(sendBuf, byteCount);
sendBuf[byteCount] = crcData >> 8;
byteCount++;
sendBuf[byteCount] = crcData & 0xff;
sendCount = byteCount + 1;
beginSend();
已经很熟悉了。
*************************************
//取寄存器值 返回0表示成功
UINT16 getRegisterVal(UINT16 addr, UINT16 *tempData)
{
UINT16 result = 0;
UINT16 tempAddr;
tempAddr = addr & 0xfff;
switch(tempAddr) //& 0xff
{
case 0:
*tempData = testRegister0;
break;
case 1:
*tempData = testRegister1;
break;
case 2:
*tempData = testRegister2;
break;
case 3:
*tempData = testRegister3;
break;
case 4:
*tempData = testRegister4;
break;
case 5:
*tempData = testRegister5;
break;
case 6:
*tempData = testRegister6;
break;
case 7:
*tempData = testRegister7;
break;
case 8:
*tempData = testRegister8;
break;
case 9:
*tempData = testRegister9;
break;
default:
break;
}
return result;
}
其中寄存器定义如下
UINT16 testRegister0, // 测试寄存器
testRegister1,
testRegister2,
testRegister3,
testRegister4,//存放当前温度
testRegister5,//读写寄存器 控制P1口输出
testRegister6,
testRegister7,
testRegister8,
testRegister9;
再回到MCGS仿真的例子里,
看看都有哪些寄存器
并没有线圈寄存器,事实上,线圈寄存器是利用test5的位来实现的。
我的学习目的是寄存器,那么要看温度,
温度寄存器名字 wendu,地址(只看后面)00 04
然后调慢更新周期,
在PROTEUS上得到,
有些不太理解,01 06 00 04xxxx 把温度写到PROTEUS上?先继续,下一步学习功能06。
01 03 00 03 00 02可以理解,读出地址00 03和00 04上寄存器数据,这样wendu这个变量得到了赋值。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|