熟女人妻水多爽中文字幕,国产精品鲁鲁鲁,隔壁的少妇2做爰韩国电影,亚洲最大中文字幕无码网站

技術頻道

娓娓工業
您現在的位置: 中國傳動網 > 技術頻道 > 技術百科 > 工控干貨|SMC304運動控制器之間的CAN總線級聯方法

工控干貨|SMC304運動控制器之間的CAN總線級聯方法

時間:2019-04-23 11:04:08來源:深圳市雷賽智能控制股份有限公司

導語:?工控干貨|SMC304運動控制器之間的CAN總線級聯方法

一. CAN總線實時令牌網

1. CAN 總線的特點

CAN總線(Controller Area Net)是一種有效支持分布式控制的串行通信網絡。它是由德國Bosch公司為汽車的監測、控制系統而設計,由于其具有卓越的特性及極高的可靠性,后來廣泛應用于工業過程監控設備的互連。

CAN總線只定義了ISO/OSI模型中的第一層(物理層)和第二層(數據鏈路層),其物理拓撲如圖1所示。CAN總線主要特點有:

(1) 采用差分傳輸,抗干擾性強;

(2) 采用短幀結構和CRC校驗等檢錯措施,出錯概率低;

(3) 采用基于優先權的非破壞性總線仲裁技術,可工作于多主、一對一、一對多及全局廣播方式傳送接收數據;

(4) 通信距離隨波特率而變,典型值為10 km(5 kb/s)、40 m(1 Mb/s)。

2. 令牌總線簡介

令牌總線網絡的邏輯拓撲如圖2所示。所有連接在令牌總線上的站點在邏輯上構成一個首尾相連的環,每個站點都知道自己的前導站(PS)和后繼站(NS)。

令牌實際上是一個采用特殊編碼的控制幀。網絡上只有一個令牌沿邏輯環傳遞,得到令牌的站才能發送數據,然后把令牌向下傳。在正常運行時,令牌按照站點地址的序列號從一個站點傳送到另外一個站點。這樣,這個令牌實際上是按照邏輯環而不是物理環進行傳遞。在數字序列的最后一個站點將令牌返回到第一個站點。

令牌通訊機制的優點是任何時刻網絡中只有一對節點在進行通訊,完全杜絕多節點通訊沖突的情況。

二. SMC304運動控制器CAN總線令牌網及指令

1. 雷賽CAN總線令牌網的通訊機制

SMC304運動控制器可以通過CAN總線和另外的SMC304運動控制器或雷賽其他型號的運動控制器連接,形成一個多站點的CAN總線運動控制系統,采用令牌通訊機制實現各站點之間的數據交換。與一般令牌網不同,雷賽CAN總線令牌網中有一個主站,負責令牌傳遞的管理,防止令牌丟失,以提高通訊的可靠性。

在雷賽CAN總線實時令牌網上可以發送4類數據:位、字、雙字、浮點類數據。通訊流程如下:

第一步,主站按周期將本站的寄存器數據表中的數據發送給其它各站點;之后往一個從站發送令牌消息;第二步,從站接收到令牌后,將本站寄存器數據表中的數據發送給其它各站點;之后往主站發送釋放令牌的消息;第三步,主站接收到一個從站令牌釋放消息后,往下一個從站發送令牌消息;然后回到第二步,直到所有站點數據都已經發送完成;第四步,主站周期時間到達后重復以上流程。

以上通訊過程都是在BASIC程序后臺進行,不需要用戶編程管理。

用戶需要在程序中首先初始化用于數據通訊的寄存器數據表,設置通訊周期、參與通訊的節點數和節點號;定義要通訊的數據類型、對端節點號;添加通訊數據結束標志。

然后,根據需要在程序中定時查詢本地寄存器,即可得到其他節點的數據;定時更新寄存器數據表,將新數據自動發送給其他節點。

2. 雷賽CAN總線令牌網的通訊指令

1)初始化CAN通訊數據表參數SMCCanRegTableInit  short SMCCanRegTableInit(short Enable[,short SendMode[,short CycleTime[,short CanIdNum,short* pCanIdList]]);

參數:

Enable  是否啟用寄存器表通訊:0-禁用,1-啟用 SendMode  發送方式:0-收到令牌后發送(從站),1-周期性發送(主站)

CycleTime  周期性發送時間,單位:毫秒 CanIdNum  對端節點號個數 pCanIdList 對端節點號列表

2)添加位類數據到寄存器表SMCCanRegTableAddBit short SMCCanRegTableAddBit(short CanId,short RegAddr,short RegNum,Dshort RegValue);

參數:

CanId  對端節點號 

RegAddr  對端寄存器地址

 RegNum 對端寄存器個數,范圍[1,32]

RegValue 默認值

3)添加字類數據到寄存器表SMCCanRegTableAddReg short SMCCanRegTableAddReg(short CanId,short RegAddr,short RegValue);

參數:

CanId  對端節點號

RegAddr  對端寄存器地址

RegValue 默認值

4)添加雙字類數據到寄存器表SMCCanRegTableAddLong

short SMCCanRegTableAddLong(short CanId,short RegAddr,long RegValue);

參數:

CanId  對端節點號 

RegAddr  對端寄存器地址

RegValue  默認值

5)添加浮點類數據到寄存器表SMCCanRegTableAddFloat

short SMCCanRegTableAddFloat(short CanId,short RegAddr,float RegValue);

參數:

CanId  對端節點號 

RegAddr  對端寄存器地址 

RegValue  默認值

6)添加結束標志到寄存器表SMCCanRegTableAddEnd short SMCCanRegTableAddEnd(short CanId);

參數:

CanId  對端節點號

7)更新寄存器表中的位類數據SMCCanRegTableSetBit short SMCCanRegTableSetBit(short CanId,short RegAddr,short RegNum,long RegValue);

參數:

 CanId  對端節點號

 RegAddr  對端寄存器地址

 RegNum  對端寄存器個數,范圍[1,32] 

RegValue  設置值,每一個Bit位代表一個位寄存器的值

8)更新寄存器表中的字類數據SMCCanRegTableSetReg

short SMCCanRegTableSetReg(short CanId,short RegAddr,short RegValue);

參數:

CanId  對端節點號 

RegAddr  對端寄存器地址 

RegValue  設置值

9)更新寄存器表中的雙字類數據SMCCanRegTableSetLong short SMCCanRegTableSetLong(short CanId,short RegAddr,long RegValue);

參數:

CanId  對端節點號 

RegAddr 對端寄存器地址 

RegValue 設置值

10)更新寄存器表中的浮點類數據SMCCanRegTableSetFloat short SMCCanRegTableSetFloat(short CanId,short RegAddr,float RegValue); 

參數:

CanId  對端節點號 

RegAddr  對端寄存器地址 

RegValue 設置值

三. CAN總線級聯三臺SMC304運動控制器的例程

1. 例程的硬件設置

如圖3.1所示,3臺SMC304運動控制器通過CAN總線級聯。且節點號為ID1的運動控制器的CAN1口連接了6個CANopen總線電機和模塊。(詳見本文上篇:SMC304控制器及CANopen總線產品的應用)

3臺SMC304運動控制器的CAN總線撥碼開關設置如下:

ID1的撥碼開關為:Off,Off,On,Off,Off,On。即:CAN1終端電阻使用、CAN0和CAN1獨立使用、CAN0終端電阻使用。

ID2的撥碼開關為:Off,Off,Off,On,On,Off。即:CAN1終端電阻禁用、CAN0和CAN1短接為一個接口、CAN0終端電阻禁用。

ID3的撥碼開關為:Off,Off,Off,Off,Off,On。即:CAN1終端電阻禁用、CAN0和CAN1獨立使用、CAN0終端電阻使用。

2. 例程的通訊數據

將ID2運動控制器作為主站,ID1、ID3號控制器作為從站。

D2每80毫秒向ID1發送一個字類數據;向ID3發送1個一個字類數據,一個浮點類數據。

ID1拿到令牌后,向ID2和ID3各發送一個字類數據。

ID3拿到令牌后,向ID1發送一個字類數據;向ID2發送1個一個字類數據,一個位類數據(4位)、一個浮點類數據。

3. 例程的功能

本實驗軟件功能有:

ID1、ID2、ID3號控制器分別向ID2、ID3、ID1號控制器發送一個從0~11循環變化的整數,使其輸出口OUT1~OUT11的指示燈以跑馬燈方式從左到右、每0.2秒閃爍一次;

ID1、ID2、ID3號控制器分別向ID3、ID1、ID2號控制器發送一個從11~0循環變化的整數,使其輸出口OUT10~OUT0的指示燈以跑馬燈方式從右到左、每0.2秒閃爍一次。以此檢測CAN總線令牌網的傳送字類數據的通訊速度和可靠性。

2)ID2號控制器每0.2秒將1個整數和一個浮點數合并為1個浮點數,并發送給ID3號控制器,控制其電機做點位運動。以此檢測CAN總線令牌網的傳送浮點類數據的可靠性。

3)ID3號控制器每0.2秒向ID2號控制器發送一個在0~15之間由小到大變化的、長度為4位的位類數據,一個在1111.5678~8888.5678之間由小到大變化的浮點類數據。ID1、ID2號控制器在接收字類數據、位類數據、浮點類數據的同時,檢查其正確性。

4)ID1號控制器通過CAN1口控制2個CANopen型步進電機、1個CANopen型混合伺服電機、2個CANopen型IO擴展模塊、1個CANopen型AD/DA模塊。

4. 例程的程序清單

程序清單1:ID2的程序

auto:  ' 本機為ID2,為master。

undim *

dim Cerr1,Cerr2,Ccheck

dim state1,state2

dim state3,state4,state

dim data0,data1,data2,data3

dim data0old,data1old

dim d0,d1,d2,d3

dim t1,t2,t

dim f1,f8 

dim flag1,flag2

constCanID1=1  ' ID1的節點號為1 

const CanID2=3 ' ID2的節點號為3 

const CanID3=5 ' ID3的節點號為5

setcan(1000,CanID2)  ' ID2的波特率為1000k

call RegTableInit()  ' 運行子程序RegTableInit

flag1=0 

flag2=0 

state1=20000 

state2=30011

state3=0

state4=-91111.567

data0=1

f1=1234.5678

f8=8888.5678

int_enable(1)  '中斷使能:開

timer_start(0,20)  '打開定時器0

while true

Delay(200)  '延時200毫秒

if state1>=20011 then

state1=20000  '基數設為20000,只是為了驗證傳送大數據的準確性

else

state1=state1+1  'state1在20000~20011之間由小到大變化,200毫秒變一次

endif

if state2<=30000 then

state2=30011

else

state2=state2-1  'state2在30011~30000之間由大到小變化,200毫秒變一次

endif

if state4>=8888.0 then

state4=-7777.7777 

state3=1

else

state3=state3+1  'state3在1~16之間由大到小變化,200毫秒變一次

state4=state4+1111.12345  'state4在-7777.777~8889.074之間由小到大變化

endif

if state4>=0 then  '將state3和state4合并為一個浮點數

state=state4+state3*10000

else

state=state4-state3*10000

endif

SMCCANRegTableSetReg(CanID1,20,state2)  ' 更新發送的數據

SMCCANRegTableSetReg(CanID3,20,state1) SMCCanRegTableSetFloat(CanID3,26,state)

wend

end

ontimer0:  ' 本機為ID2,50毫秒查尋一次ID1、ID3狀態。

timer_start(0, 50)  ' 打開定時器0,定時時間為50毫秒

d1=modbus_Reg(10)  ' 讀本地的寄存器,查看控制器ID1的指令

d2=d1-20000  ' d2在0~11之間由小到大變化

if d2%2=0 then ' 當d2=0、2、4、6、8、10時,

SMCWriteOutBit(d2+1,0)  ' OUT1、OUT3、OUT5、OUT7、OUT9、OUT11的LED亮

else ' 當d2=1、3、5、7、9、11時,

SMCWriteOutBit(d2,1)  ' OUT1、OUT3、OUT5、OUT7、OUT9、OUT11的LED滅

endif

d1=modbus_Reg(30)  ' 讀本地的寄存器,查看控制器ID3的指令

d3=d1-30000  ' d3在11~0之間由大到小變化

if d3%2=0 then  ' 當d3=10、8、6、4、2、0時,

SMCWriteOutBit(d3,1)  ' OUT10、OUT8、OUT6、OUT4、OUT2、OUT0的LED滅

else  ' 當d3=11、9、7、5、3、1時,

SMCWriteOutBit(d3-1,0)  ' OUT10、OUT8、OUT6、OUT4、OUT2、OUT0的LED亮

endif

data0=MODBUS_BIT(30,33)

if flag1=0 then

flag1=1  ' 第一次讀ID3的位類數據

data0old=data0

else

if data0<>data0old then  ' 根據有序數據檢查數據傳送的準確性

if data0=data0old+1 or (data0=0 and data0old=15) then

else

Cerr1=Cerr1+1  ' ID3的傳送的位類數據有錯,次數加1

print "error data = ",data0,data0old

endif

data0old=data0

endif

endif

data1=MODBUS_IEEE(36)

if flag2=0 then

flag2=1  ' 第一次讀ID3的浮點類數據

data1old=data1

else

if data1<>data1old then  ' 根據有序數據檢查數據傳送的準確性

if data1-(data1old+1110.997)<0.001 or (data1-f1<0.001 and data1-f8<0.001) then

else

Cerr2=Cerr2+1  ' ID3的傳送的浮點類數據有錯,次數加1

print "error data = ",data1,data1old

endif

data1old=data1

endif

endif

Ccheck=Ccheck+1

end

sub RegTableInit()

dim CanIdList(2)  '定義從站節點號列表

CanIdList(0) = 1  '第一個從站節點號為1 

CanIdList(1) = 5  '第二個從站節點號為5

SMCCANRegTableInit(1,1,80,2,CanIdList)  '初始化寄存器表,周期為80毫秒,從站節點數為2

SMCCANRegTableAddReg(CanID1,20,0)  '添加寄存器數據

SMCCANRegTableAddReg(CanID3,20,0) SMCCanRegTableAddFloat(CanID3,26,0)

SMCCANRegTableAddEnd(CanID1)  '寄存器數據結束標志

end sub

程序清單2:ID3的程序

auto:  ' 本機為ID3,為slave。

undim *

dim Cerr1,Cerr2,Ccheck

dim state1,state2

dim state3,state4

dim data0,data1,data2,data3

dim d0,d1,d2,d3

dim t1,t2,t

dim f1,f8

dim flag1,flag2

dim MaxData,MinData

const CanID1=1 

const CanID2=3 

const CanID3=5

MaxData=-1000

MinData=9999

flag1=0 

flag2=0

state1=20000

state2=30011

state3=0

state4=1111.5678

data0=1

f1=1234.567

f8=8888.567

setcan(1000,CanID3)

call RegTableInit()

int_enable(1)  '中斷使能:開

timer_start(0,20)  '打開定時器

SMCSetProfileUnit(0,900,6000,0.2,0.1,900)  '設置0號軸速度曲線參數

SMCSetsprofile(0,0,0.5)  '設置0號軸S段參數

while true

Delay(200)

if state1>=20011 then   ' ……

state1=20000

else

state1=state1+1

endif   ' 和ID2程序相同

if state2<=30000 then

state2=30011

else

state2=state2-1

endif   ' ……

if state3>=15 then

state3=0

else

state3=state3+1   'state3在0~15之間由小到大變化,200毫秒變一次

endif

if state4>=8888.5678 then

state4=1111.5678

else

state4=state4+1111   'state4在1111.5678~8888.5678之間由小到大變化

endif

SMCCANRegTableSetReg(CanID1,30,state1)  ' 更新發送的數據

SMCCANRegTableSetReg(CanID2,30,state2) SMCCanRegTableSetBit(CanID2,30,4,state3) SMCCanRegTableSetFloat(CanID2,36,state4)

data1=MODBUS_IEEE(26)

if data1>= 0 then  ' 將data1拆分為2個數

data0=int(data1/10000)   ' data0是1~16之間的一個整數

data2=data1-data0*10000   ' data2是-7777.777~8889.074之間的一個浮點數

else

data0=-1*int(data1/10000)-1

data2=data1+data0*10000

endif

if data0=4 or data0=12 then  ' 根據data0、data2做點位運動

SMCPMoveUnit(0,data2,0)

endif

wend

end 

ontimer0:  ' 本機為ID3,50毫秒查尋一次ID1、ID2狀態。

timer_start(0,50)

d1=modbus_Reg(20)  ' 讀本地的寄存器,查看控制器ID2的指令

d2=d1-20000

if d2%2=0 then  ' 和ID2程序相同

SMCWriteOutBit(d2+1,0)

else

SMCWriteOutBit(d2,1)

endif

d1=modbus_Reg(10)  ' 讀本地的寄存器,查看控制器ID1的指令

d3=d1-30000

if d3%2=0 then  ' 和ID2程序相同

SMCWriteOutBit(d3,1)

else

SMCWriteOutBit(d3-1,0)

endif

end

sub RegTableInit()

SMCCanRegTableInit(1,0,0)  '初始化寄存器表

SMCCanRegTableAddReg(CanID1,30,0)  '添加寄存器數據

SMCCanRegTableAddReg(CanID2,30,0)

SMCCanRegTableAddBit(CanID2,30,4,0)  '長度為4位的位類數據

SMCCanRegTableAddFloat(CanID2,36,0)

SMCCanRegTableAddEnd(CanID2)  '寄存器數據結束標志

end sub

 

程序清單3:ID1的程序

auto:  ' 本機為ID1,為slave。

undim *

dim a,b,flag1,flag2,Cerr1,Cerr2,Ccheck

dim EMoutV0,EMoutV1,EMinV0

dim state1,state2

dim d1,d2,d3,d2old,d3old

dim t1,t2,t,Tmax

Tmax=0

flag1=0 

flag2=0

const EM1out0=12

const EM1out8=20

const EM1out5=18 

const EM1out13=25 

const EM1in0=16 

const EM1in8=24 

const EM2out1=29 

const EM2out9=37 

const EM2out6=34 

const EM2out14=42 

const EM2in1=33 

const EM2in9=41 

const CanID1=1 

const CanID2=3 

const CanID3=5

setcan(1000,CanID1) 

call RegTableInit()

a=off 

b=off

EMoutV0=0 

EMoutV1=0 

EMinV0=0 

state1=20000 

state2=30011

int_enable(1)  '中斷使能:開

timer_start(0,50)  '打開定時器0

timer_start(1,60)  '打開定時器1,控制IO模塊

run 1,canmotor  '控制CAN總線電機

count=0

while true

Delay(200)

if state1>20011 then

state1=20000

else

state1=state1+1

endif

if state2<30000 then

state2=30011

else

state2=state2-1

endif

SMCCANRegTableSetReg(CanID2,10,state1)  ' 更新發送的數據

SMCCANRegTableSetReg(CanID3,10,state2)

wend

end

canmotor:   ' 控制CANopen電機的子任務

……  ' 程序略(詳見本文上篇:SMC304控制器及CANopen總線產品的應用)

end

ontimer1: ' AD/DA模塊控制 

……  '程序略

end

EM32IOControl:  ' 控制IO模塊的子任務

……  '程序略

end

ontimer0:  ' 本機為ID1,20+毫秒查尋一次ID2、ID3狀態。

t1=ticks

d1=modbus_Reg(30)  ' 讀本地的寄存器,查看控制器ID3的指令

d2=d1-20000

if flag1=0 then

flag1=1  ' 第一次

d2old=d2

if d2%2=0 then

SMCWriteOutBit(d2+1,0)

else

SMCWriteOutBit(d2,1)

endif

else

if d2<>d2old then

if d2=d2old+1 or (d2=0 and d2old=11) then

if d2%2=0 then

SMCWriteOutBit(d2+1,0)

else

SMCWriteOutBit(d2,1)

endif

else

Cerr1=Cerr1+1  ' ID3的傳送的數據有錯,次數加1

print "error data = ",d2,d2old

endif

d2old=d2

endif

endif

d1=modbus_Reg(20)   ' 讀本地的寄存器,查看控制器ID2的指令

d3=d1-30000 

if flag2=0 then

flag2=1  ' 第一次

d3old=d3

if d3%2=0 then

SMCWriteOutBit(d3,1)

else

SMCWriteOutBit(d3-1,0)

endif

else

if d3<>d3old then

if d3=d3old-1 or (d3=11 and d3old=0) then

if d3%2=0 then

SMCWriteOutBit(d3,1)

else

SMCWriteOutBit(d3-1,0)

endif

else

Cerr2=Cerr2+1  ' ID2的傳送的數據有錯,次數加1

print "error data = ",d3,d3old

endif 

d3old=d3 

endif 

endif

Ccheck=Ccheck+1

timer_start(0, 20)

t2=ticks

t=t2-t1   ' 測量ontimer0運行時間

if t>Tmax then

Tmax=t

print "max time = ",t   ' 輸出最大運行時間

endif

end

sub RegTableInit()

SMCCanRegTableInit(1,0,0)  '初始化寄存器表SMCCanRegTableAddReg(CanID2,10,0)  '添加寄存器數

SMCCanRegTableAddReg(CanID3,10,0) SMCCanRegTableAddEnd(CanID2)  '寄存器數據結束標志

end sub

5. 例程的實驗結果

三臺SMC304運動控制器通過CAN總線令牌網級聯,可以實現穩定、可靠的數據交換。該程序測試幾十小時,未發現一次通訊錯誤。

傳送一個字類數據的平均通訊時間小于5毫秒。由于控制器ID1的工作任務繁重,其負責更新傳送數據的timer0的中斷任務平均完成時間在35毫秒左右,但最長時間近70毫秒,所以,主站ID2將數據通訊周期定為80毫秒。

需要注意,有一種情況是可能發生的:在查詢本地寄存器時,第i個數據是上一個周期接收到的,第i+1個數據是本次周期接收到的。

如果這2個數據是關聯數據,如:第i個數據是軸號、第i+1個數據是運動距離;第j個周期和第j+1個周期傳送的數據不同。這時就會發生錯誤。因此,為避免這種情況發生,可以將這2個關聯數據合并為一個數據發送。

四.結論

SMC304運動控制器采用CAN總線令牌網級聯,通訊速度快、穩定可靠;可以充分發揮SMC304的軌跡控制的功能,擴大使用交流伺服電機的數量;控制器控制總線型電機的數量減少,降低了總線控制系統的編程難度。所以,該組網方式在小型生產線上應用非常合適。

總之,使用SMC304運動控制器和CANopen總線步進電機、混合伺服電機及擴展模塊,可以充分發揮雷賽公司的優勢,大幅提升運動控制系統的性價比。

五.參考文獻

[1] 趙城,張凱. 基于CAN總線實時令牌網的設計. 微型機與應用,2013年第9期 

[2] 深圳市雷賽控制技術有限公司. 雷賽SMC304-BAS運動控制器用戶手冊. 2019 

[3] 深圳市雷賽控制技術有限公司. 雷賽運動控制器SMC Basic Studio使用手冊. 2019

聲明:本文內容由企業提供,如涉及版權、機密問題,請及時聯系我們刪除(QQ: 2737591964,不便之處,敬請諒解!

標簽:

點贊

分享到:

上一篇:基于機器視覺技術檢測板材表...

下一篇:當PLC出現故障 我們如何查找?

中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.hysjfh.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。

本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。

相關資訊

網站簡介|會員服務|聯系方式|幫助信息|版權信息|網站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動網-工業自動化與智能制造的全媒體“互聯網+”創新服務平臺

網站客服服務咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權所有
粵ICP備 14004826號 | 營業執照證書 | 不良信息舉報中心 | 粵公網安備 44030402000946號

主站蜘蛛池模板: 清丰县| 拜泉县| 东乡族自治县| 通江县| 涿鹿县| 大田县| 资阳市| 沙田区| 诏安县| 宜黄县| 古交市| 蕲春县| 胶南市| 罗源县| 鄂托克前旗| 防城港市| 香河县| 岫岩| 资兴市| 无棣县| 沈阳市| 彭州市| 固安县| 赣州市| 三穗县| 靖边县| 离岛区| 曲阜市| 奇台县| 平潭县| 大丰市| 麻城市| 潢川县| 安徽省| 东乡| 阳朔县| 怀来县| 枣阳市| 玉山县| 乐清市| 福建省|